什么是 Java 中的不可变类?
在 Java 中,不可变类(Immutable Class)是指一旦创建后其状态就不能被修改的类。不可变类具有以下特点:
- 对象的状态不能改变:一旦对象被创建,其内部状态就不能被修改。所有的字段都是 final 类型,确保它们在初始化后不能被改变。
- 线程安全:由于对象的状态不能改变,因此不可变类是线程安全的,可以在多线程环境中安全地共享,而不需要额外的同步措施。
- 简化编程模型:不可变对象可以避免许多与状态变化相关的复杂性,如并发问题、副作用等。
- 缓存和哈希码:由于对象的状态不会改变,可以安全地缓存计算结果,如哈希码,从而提高性能。
创建不可变类的步骤
- 使类声明为 final:防止其他类继承并修改其状态。
- 使所有字段声明为 final:确保字段在初始化后不能被修改。
- 提供构造函数:在构造函数中初始化所有字段,并且不提供任何修改状态的方法。
- 确保对可变对象的防御性拷贝:如果类包含引用类型字段,确保这些字段指向的对象也是不可变的,或者在返回时进行防御性拷贝。
示例代码
public final class ImmutableClass {
private final String name;
private final int age;
// 构造函数
public ImmutableClass(String name, int age) {
this.name = name;
this.age = age;
}
// 提供 getter 方法,但不提供 setter 方法
public String getName() {
return name;
}
public int getAge() {
return age;
}
// 重写 equals 和 hashCode 方法
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
ImmutableClass that = (ImmutableClass) obj;
return age == that.age && name.equals(that.name);
}
@Override
public int hashCode() {
int result = name.hashCode();
result = 31 * result + age;
return result;
}
}
#java面试题#