-1

私は過去数時間、以下に困惑しています。次のように、ゼロ分数の定数を持つ Fraction クラスがあります。

class Fraction{
    private static final Fraction ZERO = new Fraction(0,1);

    public static Fraction zero(){
        return ZERO;
    }
[etc]
}

その後、実行中に ZERO の値が変化することを発見しました。

System.out.println(Fraction.zero());
Fraction half = new Fraction(1, 2);
System.out.println(Fraction.zero());

出力:

1/1
1/2

明らかに、生成される値は 0/1 である必要があり、さらに重要なことに、固定されている必要があります。Fraction クラスとそれに関連付けられた GCD 計算機の実装に問題があることは間違いありません。過去にそれらをうまくかつ広範囲に使用してきたからです。

この奇妙な動作の原因に関するアイデアや考えは大歓迎です。

4

1 に答える 1

3

クラスの残りのコードを表示する必要があります。私の推測では、分子変数と分母変数はstatic通常のインスタンス変数であるはずなのに、マークされていると思います。

final問題が何であれ、フィールドの変更によって参照されるオブジェクトの内容に問題はありません。final修飾子は、フィールドが別のオブジェクトを参照できないようにするだけです。オブジェクト自体は保護されていません。

于 2012-07-17T18:33:50.780 に答える