不可变的最终变量应该是静态的吗?

时间:2018-03-14 15:35:14

标签: java

在java中,如果变量是不可变的,那么最终应该是静态类变量吗?

我问,因为每次类的一个实例使用它时创建一个新对象似乎很浪费(因为它始终是相同的)。

示例:

每次调用方法时在方法中创建的变量:

public class SomeClass {

    public void someMethod() {

        final String someRegex = "\\d+";
        final Pattern somePattern = Pattern.compile(someRegex);

        ...

    }

}

创建一次的变量:

public class SomeClass {

    private final static String someRegex = "\\d+";
    private final static Pattern somePattern = Pattern.compile(someRegex);

    public void someMethod() {

        ...

    }

}

使用后一种代码总是更可取吗?

这个答案似乎表明最好使用后一个代码:How can I initialize a String array with length 0 in Java?

2 个答案:

答案 0 :(得分:6)

绝对不是。

class MyIntegerContainer{
    private final int x;
    public MyIntegerContainer(int x){
        this.x = x;
    }
}

如果你创建了不可变的最终x静态,那么MyIntegerContainer的所有实例将共享相同的x值,这对于一个非常好的数据容器是不可能的。

答案 1 :(得分:1)

最终,这取决于你对这些变量做了什么。

如果变量只有特定方法中的生命周期 - 也就是说,永远不会需要查看它或使用这些值 - 然后声明它们方法内部是恰当和正确的。让它比它需要的更明显只会增加未来维护者(包括你自己)的困惑。

如果变量在类的外部 可能有意义地声明它static。在常量或变量本身不存储任何状态的情况下尤其如此。

如果它不是常数,或者在课堂之外没有任何目的,那么请保持非静态和私密。