57

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

public static final int FOO = 5;

结果相当于:

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

但哪个是更​​好的做法?

4

7 回答 7

73

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

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

不会。Java 编译器会将上面的 Foo 等常量内联到调用代码中,即someFunc(FooClass.FOO);变为someFunc(5);. 现在,如果您重新编译您的库而不是调用代码,您可能会遇到令人惊讶的情况。如果您使用函数,则可以避免这种情况 - JIT 仍会对其进行优化,因此不会影响到真正的性能。

于 2012-04-06T18:54:30.027 回答
10

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

于 2012-04-06T18:47:50.550 回答
7

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

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

于 2012-04-06T18:48:23.047 回答
4

将类外的变量用作:

public def FOO:Integer = 5; 

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

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

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

于 2012-04-06T19:21:20.360 回答
1

第一个,如果 getFoo 结果是常数并且不需要在运行时进行评估。

于 2012-04-06T18:49:14.623 回答
1

我会继续使用 getFoo(),因为它允许您在将来更改实现而不更改客户端代码。正如@Tomasz 所指出的,JVM 可能会内联您当前的实现,因此您会付出很多性能损失。

于 2012-04-06T18:51:53.530 回答
0

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

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

我会去现场访问

于 2012-04-06T18:49:45.373 回答