“公共静态最终”或“私人静态最终”与getter?

在Java中,教会variables应该保持私有以实现更好的封装,但是静态常量呢? 这个:

public static final int FOO = 5; 

结果会相当于:

 private static final int FOO = 5; ... public static getFoo() { return FOO; } 

但是哪个更好?

有一个原因,不要直接在你的代码中使用常量。

假设FOO稍后可能会改变(但仍然保持不变),比方说public static final int FOO = 10; 。 只要没有人愚蠢到硬编码的价值,不应该打破任何东西?

Java编译器会将常量(如上面的Foo)内联到调用代码中,即someFunc(FooClass.FOO); 变成someFunc(5); 。 现在,如果你重新编译你的库,但不是调用代码,你可以在令人惊讶的情况下结束。 如果你使用一个函数,这是可以避免的 – JIT仍然会优化它,所以没有真正的性能。

因为最后一个variables不能在以后改变,如果你将它作为一个全局常量使它公开,不需要getter。

Getter在这里毫无意义,很可能会被JVM内联。 只要坚持与公众不断。

封装背后的想法是保护variables的不必要的变化,并隐藏内部表示。 用常量没有太大的意义。

使用class级以外的variables作为:

 public def FOO:Integer = 5; 

如果你封装不是你的优先。 否则使用第二个变体,以便公开一个方法而不是variables。

 private static final int FOO = 5; ... public static getFoo() { return FOO; } 

代码维护不要依赖variables也是更好的做法。 请记住,“过早优化是万恶之源”。

第一个如果getFoo结果是costant而不需要在运行时进行评估。

在成员上使用setter和getter的好处是能够覆盖。 这对静态“方法”(而不是函数)是无效的

也没有办法定义接口的静态方法。

我会去现场访问

我会留在getFoo()中,因为它允许您在将来更改实现而不更改客户端代码。 正如@Tomasz指出的那样,JVM可能会embedded你当前的实现,所以你付出很大的性能损失。