除了传递方法之外,我怎样才能访问类?

时间:2014-07-02 20:57:19

标签: java libgdx

让我们说我们有一个名为World的课程。其中包含一个名为Data的类。我们还有一个名为Input的第三个类。如果要调用Input.clicked(事件事件,int x,int y),我将无法访问World,这意味着我无法访问Data。你如何解决这个问题?

另一种询问方式可能是:如果您需要访问的内容不是最终的,那么如何从另一个类中访问某个方法中的某些内容无法更改?

抱歉,我很难解释这一点。

更新位:世界级已经存在,无法创建新的。它将在Game类中。

这是一个代码示例,而不是工作代码。更多伪。

public class World {

  Data data = new Data();
  Input input = new Input();

  public void update(float delta) {
    input.getInput();
    input.makeChangesBasedOnInput();
  }

  public void render(float delta) {
  }
}

public class Data {

  public int importantNumber; // Static is not an option
                              // For me I have to get a user name... but same idea here

  public Data() {
    Random ran = new Random();
    importantNumber = ran.nextInt(1000);
  }

}

public class Input {

  Button button = new Button();

  public Input() { // passing the World class does not work, ex. public Input(World world) {
    button.addListener(new ClickListener() {
      @Override
      public void clicked(InputEvent event, float x, float y) { // I can't add world here...
        // HERE IS ISSUE
        System.out.println(World.Data.importantNumber);
      }
    }
  }

  public void getInput() {
    // MAGIC
  }

  public void makeChangesBasedOnInput() {
    // MAGIC
  }

}

更新2:以下是我尝试使用TextButton& amp;来自libgdx的ClickListener。

statsButton是来自libgdx的TextButton()。

enter image description here

1 个答案:

答案 0 :(得分:0)

你说传递World类不起作用,这可能是因为你试图从匿名函数访问局部变量,例如:

public Input(World world) {
  button.addListener(new ClickListener() {
    @Override
    public void clicked(InputEvent event, float x, float y) {
      // error: world is not final
      System.out.println(world.data.importantNumber);
    }
  }
}

这可能发生了(如果没有,请告诉我)。在Java 8中,world将是effectivly final,但在Java 7或更早版本中,您必须明确声明它,如

public Input(final World world) { ... }

另一种常见方法是将您的世界存储在一个字段中:

private World world;
public Input(World world) {
  this.world = world;
  ...
}