报价:
如果静态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();