0

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

2 に答える 2

2

これはJavaの要件であるため、巧妙な方法を考え出す必要があります。外部で宣言されている匿名の内部クラス内からローカル変数またはメソッドパラメーターを変更することはできません。考えられる解決策の1つは、次のような「ホルダー」クラスを作成することです。

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

次に、メソッドに最終的なホルダーを受け入れさせると、匿名クラスがホルダーのコンテンツを変更できます。別の(醜い)オプションは、影響を受ける各パラメーターを配列にすることです。その後、配列を最終的にすることができますが、ここでも、コンテンツを自由に変更できます。

おそらく、停止して、そもそもなぜこれらの変数を変更する必要があるのか​​を自問するのが最善の方法です。おそらく、タスクの実行は代わりに何らかの値を返すはずです。

于 2013-01-01T00:56:26.133 に答える
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です。それを回避する方法はありません。:)

于 2013-01-01T01:13:36.577 に答える