在Bloch的Effective Java第2版中定义常量字段

时间:2016-04-08 09:59:49

标签: java immutability effective-java mutability

引用:

  

如果静态final字段具有可变引用类型,它仍然可以   如果引用的对象是不可变的,则为常量字段。

我不确定这是什么意思;有人能给出一个例子吗?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

您可以使用具有不可变子类型的可变类型:

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();