公共静态最后的“或“私有静态最后的”吸气剂?('public static final

2019-06-23 10:33发布

在Java中,它告诉我们,变量应该保密,以实现更好的封装性,但对于静态常量? 这个:

public static final int FOO = 5;

将在结果这相当于:

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

但是,这是更好的做法?

Answer 1:

还有一个理由,不直接在代码中使用一个常数。

假设FOO可能会改变以后(但仍保持不变),说public static final int FOO = 10; 。 只要没有人是愚蠢的,足以直接硬编码权值应不破坏任何东西?

号Java编译器将内联常数如上面的Foo到调用代码,即someFunc(FooClass.FOO); 变得someFunc(5); 。 现在,如果你重新编译库,但不调用代码,你可以在令人惊讶的情况下结束。 这是可以避免的,如果你使用一个功能 - JIT的仍然优化它就好了,所以没有真正的表现打那里。



Answer 2:

由于最终的变量不能再更改,如果你要使用它作为一个全局变量只是让公众没有必要吸气。



Answer 3:

吸气剂是毫无意义的在这里和最有可能将被JVM内联。 只要坚持公开不变。

封装背后的理念是保护变量的不必要的变化和隐藏的内部表示。 与常量它并没有多大意义。



Answer 4:

使用variales类为外:

public def FOO:Integer = 5; 

如果封装是不是你的优先级。 否则,使用第二个变型,让你暴露的方法,而不是变量。

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

也是代码维护一个更好的做法是不依赖于变量。 请记住,“过早的优化是所有罪恶的根源。”



Answer 5:

第一种,如果调用getFoo结果costant,而不是需要在运行时进行评估。



Answer 6:

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

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

我会去外地访问



Answer 7:

我会留在的getFoo(),因为它可以让你改变在未来实现在不改变客户端代码。 作为@Tomasz指出,在JVM可能会内联当前的实现,所以你付出多大的性能损失。



文章来源: 'public static final' or 'private static final' with getter?