布洛赫的有效Java第2版中常量字段的定义



报价:

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

我不知道这是什么意思;有人能举个例子吗?

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

最新更新