2015-11-13 3 views
0

Я пытаюсь понять ленивый шаблон инициализации, описанный на Wikipedia. Существует конструктор, принимающий аргумент типа FRUIT_TYPE. Во время инициализации хеш-карта проверяется, имеет ли он уже данный тип плода, и если конструктор не используется для создания плода из данного типа. Затем плод помещается на карту. Я скопировал этот пример, и он отлично работал. Но как создается плод без (imo) необходимого поля для установки его в заданный параметр в конструкторе, e. г.Java: пустой конструктор, принимающий параметр

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

Что мне не хватает?

+4

Это сломанный пример, в том, что вы не можете реально получить (нетрадиционно именованный) 'значение FRUIT_TYPE' из произвольной' Fruit' ссылки , Параметр и поле не имеют значения, поскольку ничто их не использует. Он демонстрирует ленивую инициализацию, но плохо. –

+0

@JonSkeet Где я могу найти надежный пример, поскольку он не описан в книге GOF? –

+1

Ну, вы можете легко добавить назначение внутри конструктора и, возможно, метод экземпляра 'getFruitType()', и в этот момент все будет хорошо ... –

ответ

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; 
        } 
    } 
    
+0

Мое намерение состояло в том, чтобы указать, что пример кода был неправильным даже в версии с высоким параллелизмом, а не для оживления старых дискуссий. –

 Смежные вопросы

  • Нет связанных вопросов^_^