在自定义类View的方法中:
public class View {
private Timer timer;
...
private double[][] allLevels;
...
我有一个带抽象调用的方法,需要指向变量allLevels。该变量由另一个类GameLogic生成,但在应用程序的Main中。在Main中,公共方法的返回参数然后传递给View:
public class Game extends ApplicationAdapter {
View view;
GameLogic gameLogic;
@Override
public void create () {
System.out.println("Creating");
this.gameLogic = new GameLogic();
this.gameLogic.prepareStimulus();
}
@Override
public void render () {
Gdx.gl.glClearColor(0.5f, 0.5f, 0.5f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
this.view = new View();
this.view.presentStimulus(this.gameLogic.allLevels);
}
}
由于游戏/业务逻辑非常复杂,我认为我会尝试尽可能地分离和封装MVC-ish模式。 Main使用libgdx,它要求create和render是分开的。
我的主要问题是我无法从抽象调用类范围到达类View中的变量。
public void presentStimulus(double[][] allLevels){
...
timer = new Timer();
...
timer.scheduleTask(new Task(){
@Override
public void run(){
DO SOMETHING WITH that.allLevels[0][0]
}
}, .....);
我看过a similar issue,但我想我的问题更基本。
IDE无法使用关键字"此"自动完成对属性的引用。如何让Run()方法访问外部类的实例的属性?
答案 0 :(得分:0)
问题(我很怀疑)就在这里 -
public void presentStimulus(double[][] allLevels){
...
timer = new Timer();
...
timer.scheduleTask(new Task(){
@Override
public void run(){
DO SOMETHING WITH that.allLevels[0][0]
}
}, .....);
您会看到,在此代码time.scheduleTask
中,您只是创建了一个new Task
而没有执行它。它在一段时间后用我想要的另一个线程执行,因此它在不同的上下文中运行,在执行时没有allLevels
值。因此,除非您使用allLevels
,否则无法访问该run
方法中的closure
。我不确定java
是否支持关闭,但这里有一个类似的答案可能对您有帮助 - Closure in Java 7
您可以使用其他一些解决方案,例如将hash和allLevels保存在一个可以全局访问的单独静态字典中,然后从那里选择值。