引用:
如果静态final字段具有可变引用类型,它仍然可以 如果引用的对象是不可变的,则为常量字段。
我不确定这是什么意思;有人能给出一个例子吗?
答案 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();