用吸气剂'公共静态决赛'或'私人静态决赛'?

Chr*_*ins 48 java static final private public

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

public static final int FOO = 5;
Run Code Online (Sandbox Code Playgroud)

结果与此相当:

private static final int FOO = 5;
...
public static getFoo() { return FOO; }
Run Code Online (Sandbox Code Playgroud)

但哪种更好的做法?

Voo*_*Voo 63

有一个原因是不在代码中直接使用常量.

假设FOO可能会在稍后改变(但仍保持不变),比如说public static final int FOO = 10;.只要没有人愚蠢直接硬编码这个值,不应该破坏任何东西吗?

不可以.Java编译器会将诸如Foo之类的常量内联到调用代码中,即someFunc(FooClass.FOO);成为someFunc(5);.现在,如果你重新编译你的库而不是调用代码,你可能会在令人惊讶的情况下结束.如果你使用一个函数就可以避免这种情况 - JIT仍然可以很好地优化它,因此没有真正的性能.

  • 有意思,我从未意识到这一点.我从来没有在野外遇到过吸气剂的常数. (3认同)
  • @TJ如果“常数”将来可能会改变,请使用吸气剂。如果常量始终相同,则可以使用公共常量。 (3认同)
  • @Chris取决于你的常数是什么 - 有很多常量固定不变(例如,'Pi`在这些年后不太可能变成3;)所以我不会谴责使用所有情况下的公共常数.但是应该记住这一点,因为调试这样的问题非常可怕. (2认同)
  • 哇!+10!我一直在这个行业工作的时间超过了我想提到的时间,而且我一直想知道为什么我不应该只使用一个公共常数,这样做似乎是安全的! (2认同)

Ser*_*yol 8

因为如果你将它作为一个全局常量使用它,以后不能改变最终变量,只需公开它就不需要getter.

  • 只有你绝对肯定你永远不会改变最终变量.常量由编译器内联,如果它们稍后更改并且您不重新编译所有内容,则会导致极其令人惊讶的结果.编辑:想象一下,值得回答的是让它更突出. (8认同)

Tom*_*icz 6

Getter 在这里毫无意义,很可能会被 JVM 内联。只要坚持公共常数。

封装背后的想法是保护变量的不需要的更改并隐藏内部表示。对于常量,它没有多大意义。