Mic*_*mlk 30
不,最终意味着课程无法延期.它没有说明可变性.例如:
final class MutInt {
public int modifyMe;
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*itz 22
不 - 最后一堂课意味着你不能从中继承.它与可变性无关.以下类是最终的可变的:
public final class FinalMutable {
int value;
public void setValue(int v) { value=v; }
public int getValue() { return value; }
}
Run Code Online (Sandbox Code Playgroud)
不可变性没有关键字,它更像是一种设计模式.
编辑:
这意味着,没有关键字,使一个类不可变.要使类不可变,您必须通过将它们设为final或private来保护内部.
令人困惑的是:final关键字在类上使用时具有不同的含义,然后在字段/变量上使用时具有不同的含义.前者的意思是"这个课程不能延长".第二个意思是"这个变量(或参考)不能改变".
除了其他响应之外,如果您查看代码,java.lang.String您将看到它包含一个字段:hash,它是可变的,实际上hashCode()是在第一次调用时计算和存储.
但是,该类仍然是不可变的:该hash字段不能直接访问或在类外修改.
此外,您可能会注意到JDK中的一个常见方法是实现不可变包装器,这些包装器可用于公开对象的内部状态而不允许对其进行修改; 例如
private final List<String> values;
public List<? get String> getValues() {
return Collections.unmodifiableList(values);
}
Run Code Online (Sandbox Code Playgroud)
正如其他人之前所说的final那样,虽然它在不变性策略中起作用,但它并没有使Java成为一个可用的类.要获得不变性,您应该遵循一般指导原则:
final,或使用静态工厂并保持构造函数私有private和final setXXX方法调用(即避免Java Beans约定)setXXX方法,而是任何可以改变状态的方法| 归档时间: |
|
| 查看次数: |
6522 次 |
| 最近记录: |