1

不変オブジェクトをメソッドに渡し、その値をメソッド内で変更したい場合や、別のオブジェクトをパラメーター参照に割り当てたい場合があります (例 1)。または、匿名の内部クラス内で別のオブジェクトを最終的なローカル変数に割り当てたいと思います (例 2)。これらのすべてのケースが可能なわけではないため、この目的のために Atomic(Integer|Long...) クラスまたはリスト (リストには複数のオブジェクトを含めることができるため、これは非常に悪いことです) を使用することがあります。または、オブジェクトを保持し、オブジェクトを変更できるクラスを作成することもできます。

public class ReferenceExample {

    public static void main(String[] args) {
        final Reference<String> string = new Reference<>("a");
        // Example 1:
        method(string);

        // Example 2:
        new Thread() {
            @Override
            public void run() {
                string.set("c");
            };
        }.start();
    }

    public static void method(Reference<String> string) {
        string.set("b");
    }

    private static class Reference<T> {
        private T value;

        public Reference() {}

        public Reference(T value) {
            this.value = value;
        }

        public T get() {
            return value;
        }

        public void set(T value) {
            this.value = value;
        }
    }

}

そのようなクラスが Java または共通ライブラリ (たとえば、Apache 共通プロジェクト) に既に存在するかどうか疑問に思っています。そうでない場合、これらの問題に対する他の良い解決策はありますか?

4

2 に答える 2

2

主な解決策は見つかりましたが、他の 2 つの一般的な方法は次のとおりです。

  • AtomicReference、すでに見つかっているようです
  • 多かれ少なかれ変更可能な参照として機能する単一要素の配列

とはいえ、通常、必要性を回避する方法を見つけることができます。

  • メソッドから(潜在的に異なる)参照を返します
  • 変更可能な参照をフィールドとして含むクラス内にメソッドを実装します。これは、とにかくより適切であることがよくあります
于 2012-06-05T18:43:12.887 に答える
0

プレーンなJavaには、一般的で一般的に使用されるソリューションはありません。また、javaish 固有のソリューションを使用する代わりに、1 つを使用するのはおそらく悪い習慣です。

一般的な解決策:

  • 呼び出し元に代入をさせます:

    myVal = anObject.aMethod(myVal);

  • 囲んでいるオブジェクトを提供する

    anObject.aMethod(this);

  • 変数に新しい値を割り当てるコールバックを提供します。これには、通常、コールバックが実装するインターフェースを定義する必要があります。

    anObject.aMethod(new MySetter(){ public void set(int newval) { myVal = newval; }; });

Java が、必要に応じてより多くのカプセル化を行うことを強制することは、完全に真実です。これは良いことのように思えるかもしれませんし、Java が冗長な言語と見なされる理由の 1 つと見なされるかもしれません。

于 2012-06-05T18:34:47.617 に答える