2012-04-06 106 views
41

在Java中,教会变量应该保持私有以实现更好的封装,但静态常量又如何呢?这:'公共静态最终'或'私人静态最终'与getter?

public static final int FOO = 5; 

将是结果相同的:

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

但是这是更好的做法?

+0

投票结束不具建设性(基于已提供的意见反馈)。 “FOO”真的是一个常数?该课程是否提供API的“FOO”部分?或者是终点应用程序的一部分?有数学常数从不改变。还有一些应该永远不会改变的位标志(请参阅SWT)。所以答案是“这要看情况。“ – 2012-04-06 18:57:28

回答

53

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

假设后面的FOO可能会改变(但仍然保持不变),比如说public static final int FOO = 10;。只要没有人足够愚蠢,直接硬编码值就不应该破坏任何东西?

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

+3

有趣的是,我从来没有意识到这一点,我从来没有遇到与getter在野外常量 – 2012-04-06 21:03:03

+0

感谢您的信息,似乎私人常量和getters是经验上更安全的选择和应该被认为是更好的做法 – 2012-04-07 14:18:34

+2

@Chris取决于你的常量是什么 - 有很多常数被设置为石头(例如,'Pi'在这些年后不太可能变成3);所以我在所有情况下都不会谴责使用公共常量,但应该牢记这一点,因为调试这样的问题是非常可怕的。 – Voo 2012-04-07 17:21:21

7

由于最终变量不能在以后更改,如果您将其用作全局常量,只需将其公开即可。

+6

只有当你完全确定你永远不会改变最终变量时,编译器会将内部内建的常量编入内存中,如果稍后再进行更改并且不重新编译所有内容,那么结果可能会非常令人吃惊。值得回答的是让它更加突出一点 – Voo 2012-04-06 18:51:31

3

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

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

0

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

0

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

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

我会去外地访问

0

我会留在的getFoo(),因为它可以让你改变在未来实现在不改变客户端代码。正如@Tomasz指出的那样,JVM可能会嵌入你当前的实现,所以你付出很大的性能损失。

2

使用variales类外为:

public def FOO:Integer = 5; 

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

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

对于不依赖变量的代码维护来说,也是一个更好的做法。请记住,“不成熟的优化是一切罪恶的根源”。