不变性使Java对象不可变
我的目标是使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;
}
}
我的问题是,实现Student
类不变性的最佳方法是什么
# 1 楼答案
source
Source
在Java中,字符串是不可变的,这提供了缓存、安全性、无需复制即可轻松重用等功能。 Source
# 2 楼答案
使用
final
关键字:# 3 楼答案
这很好,但我也会制作字段
final
我也会把年龄变成
int
或double
而不是字符串# 4 楼答案
final
——你已经有了private
和final
进行适当的代码更改List
或Date
,那么让它们final
就不够了。您应该从它们的getters
返回一个防御副本,这样它们的状态就不会因调用方法而发生变化李>对于第四点,假设您的类中有一个
Date
字段,那么该字段的getter应该如下所示:当你的可变场本身包含一些可变场,而这些可变场又包含一些其他可变场时,制作一个防御副本可能会成为一个头疼的问题。在这种情况下,您需要以迭代的方式复制它们中的每一个。我们将这个可变字段的迭代副本命名为深度副本
自己实现深度复制可能很麻烦。但是,如果你认为你自己陷入了这样一个要求,那就是,你应该重新考虑你的课堂设计。p>
# 5 楼答案
严格来说,你的类不是一成不变的,它只是实际上是一成不变的。要使其不可变,需要使用
final
:尽管差异似乎很微妙,但。不可变类本质上是线程安全的,有效不可变类只有在安全发布时才是线程安全的
# 6 楼答案
将变量设置为私有且无setter方法将适用于原始数据类型。我的类是否有对象集合
使任何类与集合对象不可变
使用extends collection类编写自己的集合对象,并遵循私有变量和no setter方法。或者返回集合对象的克隆对象