如何在java中创建不可变的类。如果学生类有关系(地址),如何创建不可变的类。我想让下面的类成为不可变的
final public class Student {
private final Address add;
private final int sid;
public Student(int sid, String name, Address add) {
super();
this.sid = sid;
this.name = name;
this.add = add;
}
private final String name;
public int getSid() {
return sid;
}
public final String getName() {
return name;
}
@Override
public String toString() {
return "Student [add=" + add + ", name=" + name + ", sid=" + sid + "]";
}
public Address getAdd() {
return add;
}
}
//I want to make the class below immutable
public class Address {
public int getAid() {
return aid;
}
public String getStreet() {
return street;
}
@Override
public String toString() {
return "Address [aid=" + aid + ", street=" + street + "]";
}
int aid;
String street;
public Address(int aid, String street) {
super();
this.aid = aid;
this.street = street;
}
}
public class First {
public static void main(String[] args) {
Address myAdd=new Address(179,"Maihill");
Student st=new Student(99,"anoj",myAdd);
System.out.println(st.toString());
myAdd.aid=2376;
System.out.println(st);
System.out.println("***************");
Address pAdd=st.getAdd();
//Here modified address instance then how we can make immutable.
pAdd.aid=788;
System.out.println(st);
}
}在这里我们可以修改address实例。请给我点子
发布于 2013-12-25 12:06:35
不可变的关键点是:
<代码>H19如果变量在类中进行了内部更改,则此更改不可见,并且在类外部不起作用(包括影响<代码>D10和代码
发布于 2013-12-25 12:07:14
在您的类Address中,您应该将字段设置为private (应该)和final (必须),如下所示-
public final class Address { // so no sub-classes can be made.
private final int aid; // private and final.
private final String street; // private and final.
// as before.
}您也不能使用setter方法,但是当字段为final时,这不是什么大问题(因为任何setter方法都会产生编译器错误)。
发布于 2013-12-25 12:11:53
好吧,你让学生成为半不变的很好:
您应该将同样的事情应用于Address类,使其成为不可变的,然后Student的所有状态都将是不可变的。因此,它将是:
public final class Address {
private final int aid;
private final String street;
public Address(int aid, String street) {
this.aid = aid;
this.street = street;
}
public int getAid() {
return aid;
}
public String getStreet() {
return street;
}
....
}幸运的是,您没有任何可修改的类型(一些最知名的类型是Date、Collection和Maps),否则您也应该考虑它们。
如果你有任何可变的属性,你应该在构造函数中复制保护它,并且你应该在状态泄漏的地方返回一个不可修改的或它的副本。
例如,如果你的Student类有一个birthDate属性,你应该这样做:
public final class Student {
private final Date birthDate;
public Student(int sid, String name, Address address, Date birthDate) {
this.sid = sid;
this.name = name;
this.address = address;
this.birthDate = (birthDate == null) ? null : new Date(birthDate.getTime());
}
public Date getBirthDate() {
return (birthDate == null) ? null : new Date(birthDate.getTime());
}
....
}https://stackoverflow.com/questions/20768943
复制相似问题