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

时间:2012-04-06 18:45:39

标签: java static private public final

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

public static final int FOO = 5;

结果与此相同:

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

但哪种做法更好?

7 个答案:

答案 0 :(得分:59)

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

假设FOO可能会稍后改变(但仍然保持不变),比如public static final int FOO = 10;。只要没有人能够直接对这个值进行硬编码就不会破坏任何东西吗?

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

答案 1 :(得分:7)

由于最后一个变量如果你将它作为一个全局常量使用它不能在以后更改,只需公开它就不需要getter。

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

使用课外的变量:

public def FOO:Integer = 5; 

如果封装不是您的首选。否则使用第二个变体,以便公开方法而不是变量。

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

对于不依赖变量的代码维护也是一种更好的做法。请记住,"过早优化是万恶之源"。

答案 4 :(得分:0)

getFoo结果的第一个是常量,不需要在运行时进行评估。

答案 5 :(得分:0)

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

无效

也无法定义接口静态方法。

我会选择现场访问

答案 6 :(得分:0)

我会继续使用getFoo(),因为它允许您在未更改客户端代码的情况下更改实现。正如@Tomasz所指出的那样,JVM可能会内联你当前的实现,所以你要付出很大的性能损失。