'public static final' or 'private static final' with getter?
在Java中,我们知道变量应该保持私有,以便更好地封装,但静态常数又如何呢?这是:
1 | public static final int FOO = 5; |
结果相当于:
1 2 3 | private static final int FOO = 5; ... public static getFoo() { return FOO; } |
但哪一个是更好的实践呢?
有一个原因不能在代码中直接使用常量。
假设foo以后可能会改变(但仍然保持不变),比如说
不,Java编译器将诸如FoO以上的常量内嵌到调用代码中,即EDCOX1 OR 1成为EDCOX1×2。现在,如果您重新编译您的库,但不重新编译调用代码,那么最终可能会遇到令人惊讶的情况。如果您使用一个函数,这是可以避免的——JIT仍然可以对它进行优化,因此没有真正的性能影响。
因为最后一个变量以后不能更改,如果您要将其用作全局常量,只需将其公开,就不需要getter了。
getter在这里是无意义的,很可能由JVM内联。坚持公共常数。
封装背后的思想是保护变量的不需要的更改并隐藏内部表示。对于常数来说,这没什么意义。
将类外的变量用作:
1 |
如果封装不是您的优先考虑事项。否则,请使用第二个变量,以便公开方法而不是变量。
1 2 3 | private static final int FOO = 5; ... public static getFoo() { return FOO; } |
对于代码维护来说,不依赖变量也是一个更好的实践。记住,"过早的优化是万恶之源"。
我将继续使用getfoo(),因为它允许您在将来更改实现,而不更改客户机代码。正如@tomasz所指出的,JVM可能会内联您当前的实现,因此您需要支付大量的性能损失。
对成员使用setter和getter的优点是能够覆盖。这对静态"方法"(而不是函数)无效
也没有办法定义接口静态方法。
我要去现场
如果getfoo结果是costant并且不需要在运行时进行评估,则为第一个。