【问题标题】:Processing / Cannot refer to the non final local variavle I definied in an enclosing scope处理/不能引用我在封闭范围中定义的非最终局部变量
【发布时间】:2016-01-06 15:28:28
【问题描述】:

我是处理/Java 的新手,我尝试制作一个小游戏...... 我已经创建了一个类来制作地图或布局之类的东西,我称之为地图类,它工作得很好,我可以使用数组/图像或仅使用对象来创建“地图”。 所以现在我想在我的游戏中添加一些单位。它们不应该如此困难或复杂。我只是想移动它们,这是我的单位类:

class Unit
{

int X;
int Y;
int Breite;
int Laenge;
boolean ausgewaelht = false;

Unit()
{



}

Unit(int x, int y, int breite, int laenge)
{



}

/---------------------------------------------- ---------------------

void create(UnitContent function)
{


  function.form();


}

void move(float geschwindigkeit)
{

  if(isTriggerd(X,Y,Breite,Laenge) == true){

  X = X+(int)geschwindigkeit;

  if(X > width)
  {

    X = 0;

  }
  }

}  

void setXandY(int x , int y)
 {

   X = x;
   Y = y;


 } 

 void setBreiteandLaenge(int breite, int laenge)
 {

   Breite = breite;
   Laenge = laenge;

 }  

/---------------------------------------------- ----------------------

 int getX()
 {

return X;

 }

 int getY()
 {

  return Y;

 } 

 int getBreite()
 {

  return Breite;

 }

 int getLaenge()
 {

   return Laenge;

 }    

/---------------------------------------------- ----------------------

 boolean isTriggerd(int x, int y, int breite, int laenge)
  {

    if(mouseX > x && mouseX < x+breite && mouseY > y && mouseY < y+laenge )
    {

      return true;

    }
    else 
    {

      return false; 

    }

 }

 }

如果我只使用 1 个单元,它工作得很好 ^ 我可以在课堂外亲自选择我的单元在屏幕上绘制的形式...但是我如何绘制其中的 10 个?

这是我的界面 UnitContent:

interface UnitContent
{

   void form();

}

这是我的 MainClass

Map testKarte;
Unit[] TestEinheit = new Unit[100];

int[][] array = {{0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0}};

int a = 0;


void setup()
 {

 size(500,500);


 testKarte = new Map(1,1,"",50,50);

 for(int i = 0; i < TestEinheit.length; i++)
 {

   TestEinheit[i] = new Unit();
   TestEinheit[i].setXandY(0,0);
   TestEinheit[i].setBreiteandLaenge(50,50);

 }



 }




  void draw()
  {

    background(#FFFFFF);   

   testKarte.setCisClickable(true);
  testKarte.setIsRectOrPicture(true);
  testKarte.ubdate(new MapContent(){
             public void setMapContent(int a, int b, int c, int d){



               // rect(a,b,c,d);  

               for( int i = 0; i < TestEinheit.length; i++)
                  {                                                             
                    TestEinheit[i].create(new UnitContent()
                  {

                         public void form()
                         {

                                   rect(TestEinheit[i].getX(),TestEinheit[i].getY(),TestEinheit[i].getBreite(),TestEinheit[i].getLaenge());


                         }


              });
            }
            }



             public void setMapContentMouseOver(){





             }
            public void elseMapContentMouseOver()
            {

              // wenn die Maus nicht über dem Object ist
              // ebenfalls nicht unbedingt




            }});






   }

  void mousePressed()
{



}

当我尝试以下操作时:

 for( int i = 0; i < TestEinheit.length; i++)
               {                                                             
                  TestEinheit[i].create(new UnitContent()
                  {

                    public void form()
                     {


                                    rect(TestEinheit[i].getX(),TestEinheit[i].getY(),TestEinheit[i].getBreite(),TestEinheit[i].getLaenge());


                     }


                  });

它给了我以下错误:无法引用我在封闭范围内定义的非最终局部变量 顺便说一句,public void 形式只是一个接口方法:)

有人知道如何处理这个问题吗?

【问题讨论】:

  • 错误信息相当明确和具体。你有什么问题?局部类不能引用非final 局部变量。因此,您将无法在 UnitContent 中使用 i
  • 是的,那是真的....但是我正在寻找一种方法来处理它...如果没有那个错误,我怎么能做到这一点?

标签: java class unit-testing for-loop processing


【解决方案1】:

我正在寻找一种方法来处理这个问题......如果没有那个错误,我该怎么做?

您有几个选项,具体取决于您希望 form 方法看到的内容

  • i 的值是当UnitContent 被创建时的值,或者
  • i 的值是当UnitContent#form 被调用之后

UnitContent创建时i的值

您需要UnitContent 的子类,它接受i 作为构造函数中的参数,将其存储在字段中,并在form 中使用它。

例如:

abstract class MyUnitContent extends UnitContent {
    protected int i;

    public MyUnitContent(int i) {
        this.i = i;
    }
}

TestEinheit[i].create(new MyUnitContent(i) {
    public void form() {
        Unit entry = TestEinheit[this.i];
        rect(entry.getX(), entry.getY(), entry.getBreite(), entry.getLaenge());
    }
});

(注意如果TestEinheit是本地的,则必须是final。)

稍后调用UnitContent#formi的值

限制是你只能访问final变量;这并不一定意味着这些变量不能引用具有可变状态的对象。

所以你可以将i 设为一个数组,例如:

final int[] i = new int[1];
for (i[0] = 0; i[0] < TestEinheit.length; i[0]++) {
    TestEinheit[i].create(new UnitContent() {
        public void form() {
            Unit entry = TestEinheit[i[0]];
            rect(entry.getX(), entry.getY(), entry.getBreite(), entry.getLaenge());
        }
    });
}

现在,当form 被调用时,它会读取i[0] 在被调用时的值(在上面的代码中,所有这些值都是TestEinheit.length)。

(注意如果TestEinheit是本地的,那么它也必须是final。)

【讨论】:

  • 感谢您的帮助 :) 但它也不会工作......这么多例外......刚刚添加了我的“主类”和 UnitContent 接口:/
  • @genar:以上内容肯定解决了您提出的问题。这并不意味着您的代码不会出现其他问题。
猜你喜欢
  • 1970-01-01
  • 2015-11-25
  • 2019-10-28
  • 2017-08-28
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
相关资源
最近更新 更多