在 Java 中,变量应该保持私有以实现更好的封装,但是静态常量呢?这:
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 仍会对其进行优化,因此不会影响到真正的性能。
由于最终变量不能在以后更改,如果您将其用作全局常量,只需将其公开,不需要 getter。
Getter 在这里毫无意义,很可能会被 JVM 内联。只要坚持公共常数。
封装背后的想法是保护变量的不需要的变化并隐藏内部表示。使用常量没有多大意义。
将类外的变量用作:
public def FOO:Integer = 5;
如果您的封装不是您的优先事项。否则,请使用第二个变体,以便公开方法而不是变量。
private static final int FOO = 5;
...
public static getFoo() { return FOO; }
不依赖变量也是代码维护的更好做法。请记住“过早的优化是万恶之源”。
第一个,如果 getFoo 结果是常数并且不需要在运行时进行评估。
我会继续使用 getFoo(),因为它允许您在将来更改实现而不更改客户端代码。正如@Tomasz 所指出的,JVM 可能会内联您当前的实现,因此您会付出很多性能损失。
在成员上使用 setter 和 getter 的优点是能够覆盖。这对静态“方法”(而不是函数)无效
也没有办法定义接口的静态方法。
我会去现场访问