ksv*_*ksv 1 java immutability cloneable
我几乎没有问题/疑点来填充HashMap中的值
我希望HashMap接受"Student"作为键,"Details"作为值.由于hashMap的键应该是不可变的,所以我有一些疑问,如果可以解决这个问题
学生班参考哪个参考"实验室"
public class Student {
private String id;
private String name;
private Department dept;
public Student(String id, String name, Department dept)
{
this.id=id;
this.name=name;
this.dept=dept;
}
public Department getDepartment()
{
return this.dept;
}
}
public class Department {
private String deptId;
private Lab lab;
public Department(String deptId, Lab lab)
{
this.deptId=deptId;
this.lab=lab;
}
public void setLab(Lab lab)
{
this.lab=lab;
}
}
public class Lab {
private String labId;
private String labName;
public Lab(String labId, String labName)
{
this.labId=labId;
this.labName=labName;
}
}
public class StudentDetails
{
private String fatherName;
private String address
public StudentDetails(String fatherName, String address)
{
this.fatherName=fatherName;
this.address=address;
}
}
public class StudentMaintainer {
public static void main(String[] args)
{
StudentDetails stDetails= new StudentDetails("John","Mumbai");
Lab lab= new Lab("100","CS");
Department dept= new Department("900", lab);
Student st = new Student("3000",dept);
Map<Student,StudentDetails> studentMaintainer= new ArrayList<>();
studentMaintainer.put(st,stDetails);
}
}
Run Code Online (Sandbox Code Playgroud)现在即使Student是可复制的,我也可以获得Department的引用并调用setLab()来更改StudentObject.(我错了吗?)
现在如果部门和实验室来自第三方罐子,如果学生hashCode是(primeNumber + Student.id + Department.id + Lab.id).hashcode()[只是一些奇怪的案例],我如何在我的地图中使用学生对象?
就我所理解的而言,不变性与Cloneable无关,事实恰恰相反.不变性更多地与声明类final和使用不可变字段,不可覆盖的方法,没有setter方法,返回字段或不可变字段的深层副本的getter方法等有关...请阅读定义不可变对象的策略以获取更多信息就此而言.
你的代码也有一个伪构造函数:
public void Student(String id, String name, Department dept)
{
this.id=id;
this.name=name;
this.dept=dept;
}
Run Code Online (Sandbox Code Playgroud)
不应声明真正的构造函数返回任何内容,甚至不能返回void.更好的是:
// note the difference?
public Student(String id, String name, Department dept)
{
this.id=id;
this.name=name;
this.dept=dept;
}
Run Code Online (Sandbox Code Playgroud)
此外,如果要将其作为HashMap的键,那么您的Student类应该正确地覆盖equals和hashCode.