В коде есть недостаток.Что если вы позвоните getInstance()
во второй раз с другим Context
?Вы получите экземпляр, созданный с неверным контекстом, а именно тот, который был передан в первый раз.Я не уверен, является ли это намеренным, но это по крайней мере не имеет смысла, и это может привести к путанице и неприятным ошибкам.
Если намерение состоит в том, чтобы возвращать одинаковый экземпляр для каждого специфический контекст, я бы использовал что-то вроде этого:
public class Service {
private static final Map<Context, Service> services = new HashMap<Context, Service>();
private Context context;
private Service(Context context) {
this.context = context;
}
public static synchronized Service getInstance(Context context) {
Service service = services.get(context);
if (service == null) {
service = new Service(context);
services.put(context, service);
}
return service;
}
}
Это называется Multiton .Это своего рода комбинация Factory и Flyweight .модификатор synchronized
довольно дорогой при широком использовании, вы можете использовать ReentrantReadWriteLock
.Статья в Википедии содержит пример.
Возвращаясь к истории синглтона, Википедия имеет несколько хороших примеров .Базовый, который создает синглтон во время загрузки класса, и другой, который создает синглтон по первому запросу.Но, как правило, использование этого шаблона не рекомендуется.