【发布时间】:2018-03-03 09:23:53
【问题描述】:
我想知道非空白/初始化的不可变最终字段是否会有合法用例。
换句话说:
class Foo {
private final String bar = "bar";
}
对比
class Foo {
private static final String BAR = "bar";
}
【问题讨论】:
-
私有最终字符串 bar = “bar”;根本没有意义,您只是有一个对等对象常量变量,而不是整个程序的单个常量。 IE。 'static final' 减少内存使用
-
@BoristheSpider 不为字符串节省空间,但为引用节省空间。
-
@BoristheSpider
static final字段占用的内存少于instance final。对象只有一个引用,而不是每个实例一个。 -
@Boris the Spider 取决于 JVM。 JVM 可能会也可能不会使用字符串缓存。 HotSpot 使用它,所以只会使用一个 chaster 数组(但我不知道有多少 java.lang.String 引用)。另一件事 - javac 编译器优化,可以自动添加
static。在消息格式(或 StringBuilder 例如)的情况下,不是线程安全的方法 - 不要将其用作static final,也不要简单地使用“private final”。顺便提一句。 Joshua Bloch Effective Java 解释了所有这些事情。 -
@VictorGubin JLS 要求共享字符串文字。这不是 JVM 实现者自己决定的事情。
标签: java