2012-06-01 5 views
2

Я работаю над проектом с использованием 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?

ответ

4

Первый подход вы предлагаете является предпочтительным:

bind(Foo.class).to(FooImpl.class).in(Scopes.SINGLETON); 

Это позволяет Guice выполнять инъекции зависимостей в FooImpl по мере необходимости. Это не возможно при ручном привязке к экземпляру с использованием toInstance(), как в вашем последнем предположении.

И наконец, шаблон дизайна Singleton is an anti-pattern for many reasons. Обратите внимание, что это относится к реализации с использованием getInstance() и т. Д .; имея один экземпляр класса для жизни вашего приложения (например, объекты в области Guice), является не плохим любым способом.

Также см. Guice's page on scopes для некоторых руководств по использованию в области однократного использования.

+0

Я знаю, что Singleton - это анти-шаблон, но я не являюсь разработчиком кода, поэтому мне нужно работать с ним! –

+0

Но, используя первый способ, возможно, что кто-то по ошибке забудет об инъекции зависимостей и создаст экземпляр singleton с новым .. Таким образом, в этом случае у нас будет два экземпляра синглтонов, что является проблемой (в моем проекте, например) –

+0

Обычно вы ограничиваете видимость реализации ('FooImpl') пакетом private или около того. Потому что вы правы: пользователи не должны сами создавать экземпляры. См. [Эта ссылка на скрытие скрытых конструкторов] (http://code.google.com/p/google-guice/wiki/KeepConstructorsHidden). Если вы застряли с 'FooImpl', то это уже не самое лучшее решение. Я полагаю, что привязка экземпляра (ваше последнее предложение) была бы второй по величине. – Torious