Я работаю над проектом с использованием Dependency injection Google Guice Framework.Два экземпляра синглтонов с инъекцией зависимостей (Google Guice)
Это можно связать класс с одноплодной сферой, в Guice как:
bind(Foo.class).to(FooImpl.class).in(Scopes.SINGLETON);
Если FooImpl
класса сам по себе является реальным класс синглтона как:
public class FooImpl implements Foo{
public static final FooImpl INSTANCE = new FooImpl();
public static FooImpl getInstance(){...}
// ...
}
или
public class FooImpl implements Foo{
private FooImpl instance = null;
private FooImpl(){...}
public static FooImpl getInstance(){
if(instance == null)
instance = new FooImpl();
return FooImpl();
// ...
}
// ...
}
Итак, можно было бы объявить два синглтона в проекте, первый объявить г по Guice и второй по традиционному способу getInstance()
.
Google Guice также может связывать интерфейсы с конкретным экземпляром с помощью метода toInstance()
.
Таким образом, вместо связывания с областью Singleton, shouln't быть лучший способ связать Singleton, в Java с этой декларацией:
bind(Foo.class).toInstance(FooImpl.getInstance());
вместо первого? Это более безопасно? Можно ли иметь два экземпляра синглтонов таким образом?
Каков наилучший способ объявления синглетов с помощью Google Guice?
Я знаю, что Singleton - это анти-шаблон, но я не являюсь разработчиком кода, поэтому мне нужно работать с ним! –
Но, используя первый способ, возможно, что кто-то по ошибке забудет об инъекции зависимостей и создаст экземпляр singleton с новым .. Таким образом, в этом случае у нас будет два экземпляра синглтонов, что является проблемой (в моем проекте, например) –
Обычно вы ограничиваете видимость реализации ('FooImpl') пакетом private или около того. Потому что вы правы: пользователи не должны сами создавать экземпляры. См. [Эта ссылка на скрытие скрытых конструкторов] (http://code.google.com/p/google-guice/wiki/KeepConstructorsHidden). Если вы застряли с 'FooImpl', то это уже не самое лучшее решение. Я полагаю, что привязка экземпляра (ваше последнее предложение) была бы второй по величине. – Torious