不可变类中的对象作为成员变量

时间:2014-07-27 19:41:34

标签: java immutability

我有一个包含Employee对象的类X.我想让类X成为不可变的。现在即使我将Employee对象声明为final,Employee类也是独立存在的,人们可以访问该特定employee对象的setter方法。是否有可能有一个普通的类Employee和另一个持有Employee的不可变类X但是一旦分配了Employee的值就不能改变它?

public final class X {

private final Employee emp;

public X (Employee e){
   this.emp = e;

}
public Employee getEmp(){

return emp;

}

} 

员工类我不想让它变成不可变的,只是想让类X成为immutable.Hence一旦员工被分配,就不应该让它改变它。 如果没有使Employee类成为不可变的话,这是可能的吗? 我希望类Employee独立存在,所以不要私有化它的构造。

2 个答案:

答案 0 :(得分:6)

您不必公开不可变类的Employee成员。您可以引入仅公开Employee的相关字段的getter方法。

public final class X {

  private final Employee emp;

  public X (Employee e){
     this.emp = e.clone ();
  }

  public String getEmpName(){
    return emp.getName();
  }

  public int getEmpSalary(){
    return emp.getSalary();
  }

} 

当然,还有一件事要做,以确保课程真的不可变。构造函数应该创建传递给它的Employee的副本。否则,构造函数的调用者仍将具有对Employee的引用,并且能够更改该对象。

答案 1 :(得分:3)

您可以向Employee添加一个复制构造函数,并在其实例传入或传出不可变类时使用它。

public final class X {

    private final Employee emp;

    public X (Employee e){
       this.emp = new Employee(e);

    }
    public Employee getEmp(){
      return new Employee(emp);
    } 
} 

话虽如此,你仍然应该认真地重新评估你是否会更好地使Employee成为不可变的,因为所有这些复制都会有相当大的开销。

相关问题