0

私は問題があります。数値インターフェイスを作成し、インターフェイスに静的最終オブジェクトを作成しています。オブジェクトを変更して同等性をチェックすると、true が返されます。「等しい」を上書きしましたが、問題は変わりません。

コードは次のとおりです。

public interface Numeric<T extends Number> extends Cloneable, Comparable<T> {

     public static final Numeric<Short> SHORT = new Numeric<Short>() {

            private short value = (short) 0;

            @override
            public Numeric<Short> add(Short value) {
                               this.value += value;
                               return this; 
            }

            @override
            public Short value() {
                   return value;
            }
     }

     public Numeric<T> add(T value);

     public T value();

     //....
}

public class Test {
   public static void main(String[] args) {
        Numeric<Short> one = Numeric.SHORT;
        Numeric<Short> two = Numeric.SHORT;
        one.add(Short.MIN_VALUE);
        System.out.println(two.value()); //print -32768!!!!! why not 0?
   }
}

答えてくれてありがとう!

4

4 に答える 4

0

これSHORTは、シングルトンと同じように扱われる静的であるためです。両方の割り当てonetwo同じ参照を指しています。

shorts の最小値を「1」に追加したため、実際にはシングルトンの which two points も変更されています。

于 2013-05-05T16:23:17.070 に答える
0

onetwo同じオブジェクト ( )を参照しますNumeric.SHORTShort.MIN_VALUE(これは に等しい-32768) をに追加すると、それらは同じオブジェクトであるため、 にoneも追加されます。two

twoへの変更による影響を受けないようにする場合は、割り当てごとoneに のコピーを作成する必要があります。Numeric.SHORT

于 2013-05-05T16:23:19.153 に答える
0

SHORT として宣言しました。これは、共有コピーstaticを意味します。

あなたが言ったとき

    Numeric<Short> one = Numeric.SHORT;
    Numeric<Short> two = Numeric.SHORT;

参照oneとは、基本的に である同じオブジェクトtwo指していました。の値が変更されましたが、これはまだ によってポイントされているため、値が出力されます。SHORTone.add(Short.MIN_VALUE);SHORTtwoShort.MIN_VALUE-32768

于 2013-05-05T16:23:49.843 に答える
0

static Numeric<Short>と呼ばれるを定義しましたSHORT

staticインターフェイスのすべての実装で共有される 1 つのインスタンスがあることを意味しNumericます。を参照するたびNumeric.SHORTに、同じインスタンスを参照します。

oneNumeric.SHORTを参照twoし、同じものを参照しNumeric.SHORTます。

one.add(Short.MIN_VALUE);の値を呼び出すと、 Numeric.SHORT.valueis now Short.MIN_VALUE.

次に呼び出すtwo.value()two、同じNumeric.SHORTインスタンスであるため、Short.MIN_VALUE-32768 が返されます。

于 2013-05-05T16:26:23.947 に答える