Как инициализировать мой одноэлементный объект - PullRequest
1 голос
/ 09 сентября 2011
public class FooClient {

    private Foo foo;
    private final static String key = "<api-key>";

    private static FooClient client = new FooClient();

    private FooClient() {
        foo = new Foo(key);
    }

    public static FooClient getFooClient() {
        return client;
    }
}
  1. Можно ли инициализировать client указанным выше способом.
  2. Должен ли я объявить private Foo foo;как статический, я предполагаю, что это не так.
  3. Если мне нужно поддерживать разные синглтоны для разных ключей, я должен изменить getFooClient(String key), чтобы взять ключ и кэшировать его, чтобы я мог вернуть синглтон FooClientsкоторые являются специфическими для ключа.

Ответы [ 3 ]

4 голосов
/ 09 сентября 2011
  1. Да. В конструкторе вы можете проверить, если client != null, и если это так - выведите ошибку. (это будет противостоять отражениям)

  2. Нет, это поле экземпляра синглтона

  3. Да. И вы должны иметь Map<String, Foo>. Но обратите внимание, что это не «разные синглтоны» - ваш синглтон - это «клиент». Другие классы могут быть созданы несколько раз.

2 голосов
/ 09 сентября 2011

Обычно вы заявляете

private static final FooClient client = new FooClient();

Это традиционная реализация Singleton . См. страницу википедии для других вариантов реализации.

Я бы не объявил Foo foo как static.

Если ваш синглтон может возвращать разные экземпляры в зависимости от ключа, тогда хорошей идеей будет передать значение ключа в методе getFooClient().

1 голос
/ 09 сентября 2011

Если у вас есть несколько предметов, то это не одиночка.

Я бы использовал enum в обоих случаях.

Для случая, когда это всего один.

enum FooClient {
    INSTANCE;

    private final Foo foo = new Foo("<api-key>");
}

для случая, когда существует более одного.

enum FooClient {
    INSTANCE1("<api-key>"), INSTANCE2("<api-key2>");

    private final Foo foo;
    FooClient(String apiKey) {
        foo = new Foo(apiKey);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...