Bloch's Effective Java 第二版中常量域的定义

Definition of a constant field in Bloch's Effective Java 2nd edition

引用:

If a static final field has a mutable reference type, it can still be a constant field if the referenced object is 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();

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