0

假设我有一个 java 类(我们将调用它ThatClass),其中包含很多静态最终字段(尽管它们都不是值字段),并且假设我从一个类中的方法访问了很多这些字段,每个字段很多次我们会打电话ThisClass。考虑到内存使用和性能都很关键的情况,是否值得将静态最终字段存储在as 字段的ThatClass方法中?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.
     */
}

我知道我不需要将这三个字段作为Bar实现 B 中的方法的参数传递,但为了便于讨论,假设这是必要的。

问题:

  1. 两种实现之间的性能有什么区别吗?B比A快吗?

  2. 关于内存成本,B比A需要更多的内存?我想它确实如此,但只是多一点(B中每个额外字段的一个额外引用。每个引用都是一个int的大小,对吗?)

谢谢!

4

1 回答 1

1

+1 拉塞尔所说的。此外,在两个地方定义字段违反了 DRY 原则(维基百科)。您举了一个非常简单的示例,但假设您需要更改其中一个静态字段的定义。对于第二个实现,您必须更新代码两次 - 假设您记得您对同一字段有两个定义。

于 2013-03-26T22:26:29.720 回答