Java变量正在从内部类中访问

Java变量正在从内部类中访问,java,variables,final,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() {

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
        }
    });
}

您必须找到一种巧妙的解决方法,因为这是Java中的一个需求。不能从外部声明的匿名内部类中修改局部变量或方法参数。一种可能的解决方案是创建一个“holder”类,如:

class Holder {
    Object c;
    int x;
    int y;
}
然后让您的方法接受最终的持有者,匿名类可以修改持有者的内容。另一个(丑陋的)选项是将每个受影响的参数设置为数组。然后数组可以是最终的,但是,同样,您可以自由修改内容


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

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

class Holder {
    Object c;
    int x;
    int y;
}
然后让您的方法接受最终的持有者,匿名类可以修改持有者的内容。另一个(丑陋的)选项是将每个受影响的参数设置为数组。然后数组可以是最终的,但是,同样,您可以自由修改内容


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

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

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。没办法

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

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。没办法

如果我将此方法移动到另一个类,它将非常好地工作。。。我不明白。如果我把这个方法移到另一个类中,它工作得非常好。。。我不明白。