要实现一个像String一样不可变的Java类,包括以下几个步骤:
1. 将类声明为final和所有字段声明为private
public final class ImmutableClass {
private final String field1;
private final int field2;
public ImmutableClass(String field1, int field2) {
this.field1 = field1;
this.field2 = field2;
}
// getter methods
}
使用final关键字来声明类,保证该类不会被继承。同时,将所有字段声明为private限制了字段的访问权限,只能通过getter方法来获取字段的值,这样可以避免外部直接修改字段的值,保证了类的不可变性。
2. 不提供setter方法
在ImmutableClass中不提供setter方法,以避免外部对类中的字段进行修改。
3. 使用deep-copy方法初始化和返回字段的值
在ImmutableClass中,使用deep-copy方法来初始化和返回字段的值。这意味着在使用数组或其他引用类型时,我们要使用.clone()方法来避免直接使用原始数据。这样做可以确保类的不可变性,例如:
public final class ImmutableArrayClass {
private final int[] array;
public ImmutableArrayClass(int[] array) {
this.array = array.clone();
}
public int[] getArray() {
return array.clone();
}
}
这个类中我们使用了clone()方法来初始化和返回数组的值,确保了类的不可变性。
示例 1
ImmutableClass obj = new ImmutableClass("hello", 123);
String s = obj.getField1(); // "hello"
int i = obj.getField2(); // 123
上述示例中,我们创建了一个ImmutableClass对象,并通过getter方法来获取类中的两个字段的值。由于ImmutableClass的字段都是final修饰的,它们的值不可改变,因此可以确保类的不可变性。
示例 2
int[] array = {1, 2, 3};
ImmutableArrayClass obj = new ImmutableArrayClass(array);
int[] arrayCopy = obj.getArray(); // {1, 2, 3}
arrayCopy[1] = 5;
int[] arrayCopy2 = obj.getArray(); // {1, 2, 3}
上述示例中,我们创建了一个ImmutableArrayClass对象,使用它的getter方法获取了类中的数组对象并进行了修改。由于我们使用了.clone()方法来返回数组的值,所以即使外部对数组的值进行了更改,ImmutableArrayClass的原始数据仍会保持不变,确保了类的不可变性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java如何实现一个像String一样不可变的类 - Python技术站