所有java
对象都可以包含mutable
和immutable
。很明显,例如,字符串是immutable
. 但是如果我想创建自己的immutable
类型,那么它必须满足什么要求呢?
我有一个这样的例子:
public class ImmutableObject {
private final String string;
private final Date date;
public ImmutableObject(String string, Date date) {
this.string = string;
this.date = date;
}
public Date getDate() {
return new Date(date.getTime());
}
public String getString() {
return string;
}
}
我可以认为它是不可变的吗?字段是必需的final
吗?如果其中一个字段,例如,一个字符串,不是final
,那么这个类的一个对象可以被认为是不可变的吗?这个类是否考虑到了多线程的所有缺陷?
是的,字段必须是
final
.我不会在不可变对象和具有只读方法的对象之间放置等号。事实上,作为一种优化,编译器可以很容易地重新排列带有指令的行,这就是所谓的重新排序。因此,您的对象可能可以从其他线程访问,但其变量可能未初始化。在单线程应用程序中,这基本上不是问题,但如果您在多线程环境中工作,那么 final 将保护您的变量免受此类排列的影响。
现在说到你的问题: