引用:
如果静态最终字段具有可变引用类型,则如果引用的对象是不可变的,它仍然可以是常量字段。
我不确定这是什么意思;有人可以举个例子吗?
引用:
如果静态最终字段具有可变引用类型,则如果引用的对象是不可变的,它仍然可以是常量字段。
我不确定这是什么意思;有人可以举个例子吗?
Josh 正在讨论的一个示例是List
,它是一个可变类型(add()
、remove()
等),但您可以为其分配一个不可变实例:
public static final List<String> NAMES = Collections.unmodifiableList( Arrays.asList("foo", "bar")); // immutable
顺便说一句,一个看起来像常数但实际上不是常数的例子是Date
常数:
public static final Date EPOCH = new Date(0);
但随后一些代码可以做到这一点:
EPOCH.setTime(123456789); // oops!
Date
是可变的!每个人都会看到这样的变化。
与此相反的是String
,它是不可变的:
public static final String NAME = "Agent Smith"; // immutable
您可以拥有一个具有不可变子类型的可变类型:
class Mutable {} // Not immutable, because it can be extended.
final class Immutable extends Mutable {}
// Reference type is mutable, but referenced object is immutable.
static final Mutable CONSTANT = new Immutable();