Правильное объявление синглтона в Java и правильная инициализация приватной хеш-таблицы - PullRequest
0 голосов
/ 05 декабря 2011

Мне нужно несколько советов о том, как инициализировать этот хеш внутри синглтона.

Итак, согласно автору действующего java, вы объявляете синглтон с использованием перечисления: https://sites.google.com/site/io/effective-java-reloaded/effective_java_reloaded.pdf?attredirects=0

ТакПока у меня есть это:

public enum MySingleton {
  INSTANCE;

  private final Hashtable<SomeEnumType, UserSettings> settings;

  public final UserSettings getSettings(SomeEnumType enumType) {
     return settings.get(enumType);
  }

}

Так что я думаю, что мой синглтон правильный, мне нужна помощь в том, как я могу инициализировать хеш-таблицу настроек inline.

private final Hashtable<SomeEnumType, UserSettings> settings = new Hashtable<SomeEnumType, UserSettings>() {{
  put(SomeEnumType.Blah1, new UserSettings ???????  );
}};

Скажите, что мой UserSettings имеетнекоторые поля, могу ли я установить их встроенными?Любые комментарии к синглтону, это нормально?

Примечание: я не буду обновлять этот хеш вообще после его инициализации.

Ответы [ 4 ]

2 голосов
/ 05 декабря 2011

Поскольку вы не обновляете Hashtable, вам не требуется синхронизация, поэтому вместо этого я бы использовал HashMap. У вас есть 2 варианта инициализации карты.

1) В конструкторе enum

public enum MySingleton {
  INSTANCE;

  private final HashMap<SomeEnumType, UserSettings> settings;

  private MySingleton(){
    settings = new HashMap<SomeEnumType, UserSettings>();
    settings.put(...,...);
  }

  public final UserSettings getSettings(SomeEnumType enumType) {
     return settings.get(enumType);
  }

}

2) В блоке инициализатора

public enum MySingleton {
  INSTANCE;

  private final HashMap<SomeEnumType, UserSettings> settings;
  {
    settings = new HashMap<SomeEnumType, UserSettings>();
    settings.put(...,...);
  }

  public final UserSettings getSettings(SomeEnumType enumType) {
     return settings.get(enumType);
  }

}
1 голос
/ 05 декабря 2011

Google говорит Синглтон вреден - не в порядке.

Правильный способ написать это, если нужно, изложен Джошуа Блохом в "Эффективной Java".

http://electrotek.wordpress.com/2008/08/06/singleton-in-java-the-proper-way/

0 голосов
/ 05 декабря 2011

Синглтоны, как правило, плохие, они являются своего рода глобальными переменными.

Чтобы ответить на вопрос, если вам нужно инициализировать таблицу в этом синглтоне, вы можете просто использовать блок инициализации (как вы это сделали для элементов), но в синглтоне.

public enum MySingleton {
  INSTANCE;

  private final Map<SomeEnumType, UserSettings> settings;
  {
    settings = new EnumMap(SomeEnumType.class);
    settings.put(...); // etc.
  }
  public final UserSettings getSettings(SomeEnumType enumType) {
   return settings.get(enumType);
  }
}
0 голосов
/ 05 декабря 2011

Я не знаком с использованием enuns для Singletons. Подход, который я предпочитаю, заключается в использовании статических инициализаторов следующим образом:

public class MySingleton {

      private final Hashtable<SomeEnumType, UserSettings> settings;

      // As this is static, the VM makes sure that this is called only once
      private static final MySingleton INSTANCE = new MySingleton(); 

      // We know the contstructor is called only once.  Making it private
      // guarentees no other classes can call it.
      // ==> Thus this is a nice safe place to initialize your Hash
      private MySingleton {
          settings = new Hashtable<SomeEnumType, UserSettings>();
      }

      public static MySingleton getInstance() {
          return INSTANCE;
      }

     public final UserSettings getSettings(SomeEnumType enumType) {
         return settings.get(enumType); 
     }
}

И абоненты получают доступ к вашей карте следующим образом:

MySingleton.getInstance().getSettings(someEnum);

Предположительно, ваш синглтон делает что-то кроме управления хешем. В противном случае гораздо более простой подход состоит в том, чтобы просто сделать сам хэш статичным.

Другой распространенный подход к синглетонам (который мне тоже не нравится) - создание экземпляра синглтона по требованию следующим образом:

public class MySingleton {
    private MySingleton instance;

    private MySingleton() {}

    public static synchronized MySingleton getInstance() {
        if (instance == null)  instance = new MySingleton ();
        return instance;
    }
}

Причина, по которой мне это не очень нравится, заключается в том, что для обеспечения безопасности потоков требуется синхронизация метода getInstance (). Вы получаете небольшой удар производительности для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...