Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有可变成员字段的不可变类_Java_Class_Immutability_Mutable - Fatal编程技术网

Java 具有可变成员字段的不可变类

Java 具有可变成员字段的不可变类,java,class,immutability,mutable,Java,Class,Immutability,Mutable,假设我有一个不可变的类,比如Employee,其可变成员地址字段的类型如下所示: public final class Employee{ private final Integer empId; private final String empName; private final Address address; public Integer getEmpId(){ return empId; } public String

假设我有一个不可变的类,比如Employee,其可变成员地址字段的类型如下所示:

public final class Employee{
    private final Integer empId;
    private final String empName;
    private final Address address;

    public Integer getEmpId(){
        return empId;
    }
    public String getEmpName(){
        return empName;
    }
    public Address getAddress(){
        return address;
    }
}

如上所示,Employee类试图保持不变,但真的是这样吗


我们可以更改Employee对象的地址,从而打破不变性。尽管有可变成员,Employee类仍然可以不可变的方式有哪些?

绝对不可变的类只能在以下情况下:

  • 这门课是期末考试
  • 所有字段都是最终字段
  • 如果字段是一个对象,那么在这个对象中,所有字段也必须是不可变的,类本身也必须是最终的
  • 因此,setter不应该出现在这个类中


    因此,在您的情况下,可以实现部分不可变。

    绝对不可变类只能在以下情况下实现:

  • 这门课是期末考试
  • 所有字段都是最终字段
  • 如果字段是一个对象,那么在这个对象中,所有字段也必须是不可变的,类本身也必须是最终的
  • 因此,setter不应该出现在这个类中


    因此,在您的情况下,可以实现部分不变性。

    简而言之,不可以。您最好的办法是创建一个扩展
    地址并隐藏setter功能的
    不变性地址。真正的不可变性要求当前对象是不可变的(完全是最终的),并且其所有实例变量也是不可变的。简而言之,不是。最好的办法是创建一个扩展
    地址并隐藏setter功能的
    不可变地址。真正的不变性要求当前对象是不可变的(完全是最终的),并且它的所有实例变量也是不可变的。
    
    public class Address {
        private String firstLine;
        private String secondLine;
        private Integer pinCode;
    
        public String getFirstLine() {
            return firstLine;
        }
        public void setFirstLine(String firstLine) {
            this.firstLine = firstLine;
        }
        public String getSecondLine() {
            return secondLine;
        }
        public void setSecondLine(String secondLine) {
            this.secondLine = secondLine;
        }
        public Integer getPinCode() {
            return pinCode;
        }
        public void setPinCode(Integer pinCode) {
            this.pinCode = pinCode;
        }   
    }