如何初始化我的单例对象

时间:2011-09-09 06:51:39

标签: java singleton

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. 我应该宣布私人Foo foo;作为静态,我猜不是这样。
  3. 如果我必须为不同的密钥支持不同的单例,我应该修改getFooClient(String key)以获取密钥并对其进行缓存,以便我可以返回特定密钥的单例FooClients。

3 个答案:

答案 0 :(得分:4)

  1. 是。在构造函数中,您可以检查client != null是否为 - 抛出错误。 (这将反映反射实例化)

  2. 不,它是单身人士的实例字段

  3. 是。你应该有一个Map<String, Foo>。但请注意,这不是“不同的单身人士” - 你的单身人士是“客户”。其他类可以多次实例化。

答案 1 :(得分:2)

通常你宣布

private static final FooClient client = new FooClient();

这是traditional Singleton implementation。有关其他实施选项,请参阅wikipedia page

我不会将Foo foo声明为static

如果您的单例可以根据键返回不同的实例,那么最好在getFooClient()方法中传递键值。

答案 2 :(得分:1)

如果您有多个东西,它不是单身。

我会在两种情况下使用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);
    }
}