3

引用:

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

我不确定这是什么意思;有人可以举个例子吗?

4

2 回答 2

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
于 2016-04-08T10:13:20.017 回答
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();
于 2016-04-08T10:07:43.783 回答