java-使用getter的“ public static final”或“ private static final”?

在Java中,有人教导说应该对变量进行私有化以实现更好的封装,但是静态常量呢? 这个:

public static final int FOO = 5;

结果将与此等效:

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

但是哪个更好的做法?

Chris Cummins asked 2020-02-22T01:35:35Z
7个解决方案
63 votes

有一个原因不直接在代码中使用常量。

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

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

Voo answered 2020-02-22T01:36:05Z
8 votes

由于最终变量如果以后要用作全局常量,则无法更改,因此只需将其公开即可,而无需获取任何getter。

Serdar Dogruyol answered 2020-02-22T01:36:25Z
4 votes

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

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

Tomasz Nurkiewicz answered 2020-02-22T01:36:49Z
3 votes

将类外的变量用作:

public def FOO:Integer = 5; 

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

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

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

profimedica answered 2020-02-22T01:37:18Z
1 votes

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

shams answered 2020-02-22T01:37:39Z
0 votes

getFoo结果的第一个是恒定的,不需要在运行时进行评估。

dash1e answered 2020-02-22T01:38:00Z
0 votes

在成员上使用setter和getter的优点是能够覆盖。这对于静态“方法”(更确切的功能)无效

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

我会去现场访问

stefan bachert answered 2020-02-22T01:38:29Z
translate from https://stackoverflow.com:/questions/10047802/public-static-final-or-private-static-final-with-getter