Naz*_*Naz 5 java final immutability
我读了关于不可变对象的这个问题,并留下了关于不可变对象和最终字段的问题:
为什么我们需要不可变类中的实例变量为final?
例如,考虑这个不可变类:
public final class Immutable
{
private final int someVal;
public Immutable(int someVal)
{
this.someVal= someVal;
}
public int getVal() {
return val;
}
}
Run Code Online (Sandbox Code Playgroud)
如果在上面的代码中没有set方法,并且实例变量只在构造函数中设置,为什么要求将实例变量声明为final?
通过标记类的所有字段final,您可以清楚地表明您希望您的类是不可变的。
假设您有以下课程:
public class Immutable {
private int value;
public Immutable (int value) {
this.value = value;
}
public int getValue () {
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
没有 setter 方法,因此人们可以很容易地假设此类是不可变的。现在是这样。但最终你的类将被其他程序员修改,并且该程序员可能会向你的类添加一些方法:
public class Immutable {
private int value;
public Immutable (int value) {
this.value = value;
}
public int getValue () {
return value;
}
public void doSomething () {
value++;
}
}
Run Code Online (Sandbox Code Playgroud)
如果字段不是,则很容易无意中添加一个修改对象状态的方法final。通过标记它们final,另一个程序员在尝试修改该字段时将得到一个编译错误,并且必须问自己为什么是这个字段final,以及他的修改是否违反了该类的约定。
有人可能会争辩说,Javadoc 应该用于记录所述类是不可变的,但坦率地说,并不是每个人都会阅读 Javadoc。我认为让代码自己说话会更好。
这样做没有要求变量final.但是,如果您明确打算永远不要更改变量,那么通常很好的做法final,因为它不仅强制执行不对写错误或其他错误的不变量,而且还声明它不可变的意图,例如.,其他程序员或你自己.
如果变量是public,那么您将严格需要进行此操作final以确保接口代码无法更改其值.
请注意,您链接的问题没有直接关系,但是,由于它讨论班是final,而不是变量.创建一个类final意味着它不能继承,而不是它是不可变的.然而,在制作不可变对象时,肯定有一个案例需要注意该问题的内容及其答案; 但它仍然是一个单独的问题.