关于java:带有getter的’public static final’或’private static final’?

'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以后可能会改变(但仍然保持不变),比如说public static final int FOO = 10;。只要没有人愚蠢到直接硬编码价值,就不应该破坏任何东西吗?

不,Java编译器将诸如FoO以上的常量内嵌到调用代码中,即EDCOX1 OR 1成为EDCOX1×2。现在,如果您重新编译您的库,但不重新编译调用代码,那么最终可能会遇到令人惊讶的情况。如果您使用一个函数,这是可以避免的——JIT仍然可以对它进行优化,因此没有真正的性能影响。


因为最后一个变量以后不能更改,如果您要将其用作全局常量,只需将其公开,就不需要getter了。


getter在这里是无意义的,很可能由JVM内联。坚持公共常数。

封装背后的思想是保护变量的不需要的更改并隐藏内部表示。对于常数来说,这没什么意义。


将类外的变量用作:

1
public def FOO:Integer = 5;

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

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

对于代码维护来说,不依赖变量也是一个更好的实践。记住,"过早的优化是万恶之源"。


我将继续使用getfoo(),因为它允许您在将来更改实现,而不更改客户机代码。正如@tomasz所指出的,JVM可能会内联您当前的实现,因此您需要支付大量的性能损失。


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

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

我要去现场


如果getfoo结果是costant并且不需要在运行时进行评估,则为第一个。