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
}
});
}
答案 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。没办法解决这个问题。 :)