【问题标题】:Is it possible to make an object immutable after it is created [duplicate]创建对象后是否可以使对象不可变[重复]
【发布时间】:2018-05-30 16:07:27
【问题描述】:

我正在创建一个对象:

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,但是否可以创建这个类的一个实例,然后在创建后使其不可变?

【问题讨论】:

  • 我会研究建造者/工厂模式,并从一开始就让它们不可变。你可以给对象一个 isImmutable 标志来禁用设置器,但这让我觉得很hacky。
  • 您可以将其所有成员设置为最终成员。这样他们只能被分配到施工。当然,您必须删除您的公共设置器,但如果您的对象是不可变的,那么它们无论如何都是多余的。

标签: java


【解决方案1】:

不可变对象是不可更改的对象,这意味着一旦创建它就无法更改其字段。基本上,您必须省略所有 setter 并将字段声明为 final。将类声明为 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】:

    您可以检查成员变量的状态,如果它们还没有被初始化,那么您可以允许设置器设置变量,否则在变量初始化后它们将什么都不做

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多