0

ThatClass多くの static final フィールド (値フィールドはありません) を持つ Java クラス (これを と呼びます) があるとします。お電話いたしますThisClass。メモリの使用とパフォーマンスの両方が重要な状況を考えると、as フィールドThatClassのメソッド内で使用されるstatic final フィールドを格納する価値はありますか?ThisClassThisClass

例:

public class ThatClass
{
    public static final Foo field1 = new Foo();
    public static final Foo field2 = new Foo();
    public static final Foo field3 = new Foo();
}


//implementation A
public class ThisClass
{
    public ThisClass()
    {
        for (int i = 0; i < 20; ++i)
        {
            Bar(ThatClass.field1, ThatClass.field2, ThatClass.field3);
        }
    }

    public void Bar(Foo arg1, Foo arg2, Foo arg3)
    {
        // do something.
    }

    /* imagine there are even other methods in ThisClass that need to access the
     * fields of ThatClass.
     */
}

今、この他の実装ThisClass

//implementation B
public class ThisClass
{
    private final Foo myField1;
    private final Foo myField2;
    private final Foo myField3;

    public ThisClass()
    {
        myField1 = ThatClass.field1;
        myField2 = ThatClass.field2;
        myField3 = ThatClass.field3;

        for (int i = 0; i < 20; ++i)
        {
            Bar(myField1, myField2, myField3);
        }
    }

    public void Bar(Foo arg1, Foo arg2, Foo arg3)
    {
        // do something.
    }

    /* imagine there are even other methods in ThisClass that need to access the
     * fields of ThatClass.
     */
}

実装 Bのメソッドの引数として 3 つのフィールドを渡す必要がないことはわかっていますがBar、この説明のために、それが必要だったと想像してください。

質問:

  1. 2 つの実装のパフォーマンスに違いはありますか? B は A より速いですか?

  2. メモリ コストに関して、B は A よりも多くのメモリを必要としますか? そうだと思いますが、もう少しだけです(Bの追加フィールドごとに1つの追加参照。各参照はintのサイズですよね?)

ありがとう!

4

1 に答える 1

1

ラッセルが言ったことに+1。さらに、フィールドを 2 か所で定義すると、 DRY の原則 (Wikipedia)に違反します。非常に些細な例を挙げていますが、これらの静的フィールドの 1 つの定義を変更する必要があると想像してください。2 番目の実装では、コードを 2 回更新する必要があります。同じフィールドに 2 つの定義があることを覚えていると仮定します。

于 2013-03-26T22:26:29.720 に答える