Когда и почему класс Child объявляет статический экземпляр экземпляра родительского класса? - PullRequest
3 голосов
/ 14 декабря 2010

Это еще один шаблон дизайна в каком-то устаревшем коде, о котором я не смог найти много информации в Google. В этом случае дочерний класс расширяет своего абстрактного родителя, но затем оборачивается и объявляет статический экземпляр родителя:

public abstract class MessageBase {
    protected DAOFactory factory;
    // method declarations
}

public class EDWMessage extends MessageBase {
    private static MessageBase instance;

    public static MessageBase getInstance(Properties properties) {
        if (instance == null) {
            instance = new EDWMessageTransaction(properties, null);
        }
        return instance;
    }
//more code
}

Я не уверен, что понимаю, к чему приведет этот шаблон проектирования (если это известный шаблон). Является ли это своего рода шаблоном удобства, чтобы не объявлять каждую переменную-член родительского элемента как статическую? Или это позволяет нескольким дочерним классам иметь один экземпляр родительского класса. Но если это так, то почему чрезмерное использование наследования по сравнению с простой композицией?

Остальная часть кода не указывает, почему это будет сделано таким образом. Любые мысли или идеи будут высоко ценится. Спасибо!

P.S. Кажется, я сталкиваюсь с множеством интересных дизайнов шаблонов в этом устаревшем коде, с которыми я не знаю, как обращаться. Спасибо всем, кто уже помог мне.

Редактировать: расширение примера кода. Отредактирую снова, когда я найду место, где на самом деле используется этот код. Yay без документации.

Ответы [ 2 ]

3 голосов
/ 15 декабря 2010

Это распространенная идиома для поточной безопасной ленивой одноэлементной инициализации.Если у вас может быть одноэлементный класс, вы делегируете частный статический экземплярный класс.

public class MySingleton{

   private MySingleton(){

   }

   public static MySingleton getInstance(){
       return SingletonCreator.INSTANCE;
   }

   private static class SingletonCreator{
     private static final MySingleton INSTNACE = new MySingleton();
   }
}

Не уверен, что именно так используется ваш дочерний класс, но это будет вариант использования для дочернего классасодержит статический экземпляр своего родителя

0 голосов
/ 15 декабря 2010

Первоначально предполагалось, что для каждого подкласса MessageBase должен быть только 1 экземпляр, и что вы можете получить доступ к этому экземпляру с помощью метода commom в базовом классе

, чтобы вы могли перебрать все типы сообщений и получить экземпляр каждого

мои 2цента

...