Java:接受参数的空构造函数

时间:2015-11-13 09:04:17

标签: java design-patterns lazy-initialization

我尝试理解Wikipedia中描述的延迟初始化模式。有一个构造函数接受FRUIT_TYPE类型参数。在初始化时,正在检查哈希映射是否已经具有给定的水果类型,如果不是,则使用构造函数来创建给定类型的水果。然后将水果放入地图中。我复制粘贴的例子,它工作正常。但是如何在没有(imo)必要字段的情况下创建水果以将其设置为构造函数中的给定参数,例如:克。

private FRUIT_TYPE fruitType;
private Fruit(FRUIT_TYPE type){this.fruitType = type}

我错过了什么?

1 个答案:

答案 0 :(得分:0)

要回答您的问题,该示例中的单个Fruit实例不知道自己的类型。在设计的例子中,它不需要知道,因为该类型既没有被检查也没有被使用过。

我强烈建议不要遵循这个例子。它有多个问题,其中最重要的是缺少类型字段:

  • 即使是高并发版本也不是线程安全的(参见http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
  • 它非常人为,难以使用。这些方面的内容可能会更接近地匹配典型用例:

    class Fruit {
      private static final AtomicReference<Fruit> banana = new AtomicReference<>();
      private FruitType type;
      private Fruit(FruitType type) {this.type = type; someExpensiveCall(); }
    
      static Fruit getBanana() {
        Fruit b = banana.get();
        if (b == null) {
          banana.compareAndSet(null, new Banana());
          b = banana.get();
        }
        return b;
      }
    }