Ruc*_*era 63 java immutability
我的目标是使Java对象不可变.我上课了Student.我用以下方式对其进行编码以实现不变性:
public final class Student {
private String name;
private String age;
public Student(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public String getAge() {
return age;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,实现Student课堂不变性的最佳方法是什么?
ass*_*ias 66
严格来说,你的课不是一成不变的,它只是有效的一成不变的.要使其不可变,您需要使用final:
private final String name;
private final String age;
Run Code Online (Sandbox Code Playgroud)
虽然差异可能看起来微妙,但它可以在多线程上下文中产生显着差异.不可变类本质上是线程安全的,只有在安全发布时,有效不可变类才是线程安全的.
Roh*_*ain 56
创建不可变类时必须考虑的事情很少:
final- 你已经有了private并final- 在代码中进行适当的更改List,或者说Date,使它们final不够用.你应该从他们那里返回一个防御性副本getters,这样他们的状态就不会通过调用方法来改变.对于第4点,假设你Date的班级中有一个字段,那么该字段的getter应如下所示:
public Date getDate() {
return new Date(this.date.getTime());
}
Run Code Online (Sandbox Code Playgroud)
当你的可变字段本身包含一些可变字段,并且反过来可以包含一些其他可变字段时,制作防御性副本会变得很头疼.在这种情况下,您需要迭代地复制每个副本.我们将此可变字段的迭代副本命名为Deep Copy.
自己实施深层复制可能很麻烦.但是,要将这个问题区分开来,一旦你发现自己陷入了制作深度防御性副本的要求,就应该再次考虑你的课堂设计.
如何使可变对象不可变?
我们为什么要创建不可变对象?
不可变对象只是其状态(对象的数据)在构造后无法更改的对象。