不可变的类是那些无法在对象的整个生命中进行修改的实例,例如字符串类。
拥有一个不变的对象可确保其值不会在系统中修改。例如,当徒劳线程尝试同时修改相同对象时,可能会出现错误和竞争问题。也就是说,不变的类自然是线程安全。另外,这些对象也可以在安全性中存储在安全性中,因为它不会更改。
要开发一个不变的类,需要Java 16:
- 将类创建为“最终”,以确保不能扩展其,以防止子类访问您的数据;
- 所有字段必须宣布为最终和私人;
- 必须在类建筑商中启动属性;
- 不提供修改对象状态(setter)的所有内容;
public final class Pessoa{
private final String nome;
private final int idade;
public Pessoa(String nome, int idade){
this.nome = nome;
this.idade = idade;
}
public String getNome() {
return this.nome;
}
public int getIdade() {
return this.idade;
}
}
从Java版本16中,可以为此目的使用记录。
记录是一种类型的类型,该类型可存储类似于Java Bean的数据,并且已经通过模式不可变。它隐含地从记录中延伸,也隐含地延伸。
这些课程是创建的,已经有一个顾问母亲的母亲,hashcode和tosting()每个属性的母亲,其名称与属性相同。
public record Pessoa(String nome, int idade) {}
仅在类别的类声明中定义组件(在此示例中是字符串名称和亲密),然后您已经“赚取”方法:name(name(),age(),等于,hashcode and tostring()。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< /p>
因此,只需几行即可创建一类不变的数据。当我们需要表示简单的对象并确保您的病情不会更改时,这可能会很大。
观察:Java中的记录以及最终类,仅为其自己的组件(属性)提供不变性。如果记录类将可变的对象引用为组件,则这些对象本身会自动不变,因为它们包含在记录中。
示例:具有一个属性的“人”记录,该记录指的是可变的“地址”对象。在这种情况下,一个人本身的实例是不可变的,也就是说,在创建人对象之后,您无法更改属性。但是,“地址”仍然可变,这意味着您可以修改人的对象的地址。示例:
Endereco endereco = new Endereco("Brasil", "Sao Paulo");
Pessoa pessoa = new Pessoa("Maria", endereco);
pessoa.getEndereco().setEstado("XXX");
这不是记录所阻止的,也不能阻止最后一类。因此,为了确保不变性确保不变的物体与可变物体没有链接或提供任何其他徒劳的物体的防御部件。