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
引用:
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