Java - 从内部类中访问变量

时间:2013-01-01 00:49:45

标签: java variables final

IntelliJ希望我让我的变量最终,但我需要他们改变(我将在方法中修改它们)。我该如何解决这个问题?

这是我的代码,我之前从未遇到过这个问题:

public void openDoor(int id, int x, int y, int face, int type) {
    Server.getTaskScheduler().schedule(new Task(0, true) {
        @Override
        protected void execute() {
            ObjectManager.deleteObject(c, x, y); //Error is here
        }
    });
}

2 个答案:

答案 0 :(得分:2)

你必须巧妙地解决这个问题,因为这是Java的一项要求。您不能从在其外部声明的匿名内部类中修改局部变量或方法参数。一种可能的解决方案是创建一个“持有者”类,如:

class Holder {
    Object c;
    int x;
    int y;
}

然后让您的方法接受最终的持有者,匿名类可以修改持有者的内容。另一个(丑陋)选项是使每个受影响的参数成为一个数组。然后数组可以是最终的,但是,您可以再次自由修改内容。

最好的选择可能是停下来问自己为什么需要首先修改这些变量。或许,您的任务执行应该返回一些值。

答案 1 :(得分:1)

添加另一个答案,因为我倾向于认为更方便的解决方案是复制变量,有点像这样:

public void openDoor(int id, final int f_x, final int f_y, int face, int type) {
    Server.getTaskScheduler().schedule(new Task(0, true) {
        int x = f_x, y = f_y; /* Either here... */

        protected void execute() {
            int x = f_x, y = f_y; /* ... or here, depending on your requirements */
            ObjectManager.deleteObject(c, x, y);
        }
    });
}

这样,您无需在每次需要时通过“Holder”对象间接访问数据。

当然,这两种方式都很难看,但那只是Java。没办法解决这个问题。 :)