如何从内部类访问外类实例的属性

时间:2015-04-05 09:36:59

标签: java model-view-controller scope libgdx

在自定义类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()方法访问外部类的实例的属性?

1 个答案:

答案 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保存在一个可以全局访问的单独静态字典中,然后从那里选择值。