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;
}
}
client
是否可以。getFooClient(String key)
以获取密钥并对其进行缓存,以便我可以返回特定密钥的单例FooClients。答案 0 :(得分:4)
是。在构造函数中,您可以检查client != null
是否为 - 抛出错误。 (这将反映反射实例化)
不,它是单身人士的实例字段
是。你应该有一个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);
}
}