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