代码之家  ›  专栏  ›  技术社区  ›  Marci-man

对象创建后是否可以使其不可变[重复]

  •  0
  • Marci-man  · 技术社区  · 6 年前

    我正在创建一个对象:

    public class Car {
    
        private ArrayList<Door> doors;
        private Engine engine;
    
        public Car(ArrayList<Door> doors) {
            this.doors = doors;
        }
    
        public Car setDoors(ArrayList<Door> doors) {
            this.doors = doors;
            return this;
        }
    
        public Car setEngine(Engine engine) {
            this.engine = engine;
            return this;
        }// and getters
    }
    

    虽然它有公共setter,但是否可以创建此类的实例,然后在创建后使其不可变?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Nikolas Charalambidis    6 年前

    不可变的是一个不可更改的对象,这意味着一旦它被创建,就没有办法更改它的字段。基本上,你必须省略所有 二传手 并将字段声明为 final . 声明类为 最终的 确保没有人可以从中继承。

    public final class Car {
    
        private final List<Door> doors;
        private final Engine engine;
    
        public Car(final Engine engine, final List<Door> doors) {
            this.engine = engine;
            this.doors = doors;
        }
    
        // Getters ONLY
    }
    

    这个例子确保类不仅是不可变的,而且 constant . 我强烈建议你读一篇关于 Gradients of Immutability .

        2
  •  0
  •   RAZ_Muh_Taz    6 年前

    您可以检查成员变量的状态,如果它们尚未初始化,那么您可以允许setter设置变量,否则它们在初始化变量后将不执行任何操作。

    public class Car {
    
        private ArrayList<Door> doors;
        private Engine engine;
    
        public Car() {
            this.doors = null;
            this.engine = null;
        }
    
        public Car(ArrayList<Door> doors) {
            this.doors = doors;
            this.engine = null;
        }
    
        public Car setDoors(ArrayList<Door> doors) {
            if(this.doors == null)
                this.doors = doors;
            return this;
        }
    
        public Car setEngine(Engine engine) {
            if(this.engine == null)
                this.engine = engine;
            return this;
        }// and getters
    }