如果类没有实现cloneable,我们如何获得不可变对象

ksv*_*ksv 1 java immutability cloneable

我几乎没有问题/疑点来填充HashMap中的值

我希望HashMap接受"Student"作为键,"Details"作为值.由于hashMap的键应该是不可变的,所以我有一些疑问,如果可以解决这个问题

  1. 学生班不可克隆
  2. 学生班参考哪个参考"实验室"

    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()[只是一些奇怪的案例],我如何在我的地图中使用学生对象?

Hov*_*els 5

就我所理解的而言,不变性与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.