Java变量正在从内部类中访问
IntelliJ希望我将变量设置为最终变量,但我需要更改它们(我将在方法中修改它们)。如何解决此问题 这是我的代码,我以前从未遇到过这个问题: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() {
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。没办法 如果我将此方法移动到另一个类,它将非常好地工作。。。我不明白。如果我把这个方法移到另一个类中,它工作得非常好。。。我不明白。