После 150-часового курса функционального программирования в университете мы сделали
Так что, просто основы, я бы сказал, примерно через месяц полный рабочий день. Четыре дня - это ничего ... Я думаю, вам просто нужно написать больше кода, чтобы привыкнуть к мышлению функционального программирования. Реализуя все снизу вверх, делая более сложные вещи по мере накопления опыта.
В Guice тоже легко! Создайте две аннотации ставок, например @One
и @Two
, а затем
bind(MySingleton.class).annotatedWith(One.class).toInstance(new MySingleton());
bind(MySingleton.class).annotatedWith(Two.class).toInstance(new MySingleton());
, а затем
@Inject
public SomethingThatDependsOnSingletons(@One MySingleton s1,
@Two MySingleton t2) { ... }
I'd like to complement Marcin's response, by adding that you don't have to limit yourself to using toInstance()
or provider methods in such a situation.
The following will work just as well:
bind(Person.class).annotatedWith(Driver.class).to(MartyMcFly.class).in(Singleton.class);
bind(Person.class).annotatedWith(Inventor.class).to(DocBrown.class).in(Singleton.class);
[...]
@Inject
public BackToTheFuture(@Driver Person marty, @Inventor Person doc) { ... }
Guice будет вводить зависимости как обычно при создании экземпляров классов MartyMcFly и DocBrown.
Обратите внимание, что это также работает, когда вы хотите связать несколько синглтонов одного типа :
bind(Person.class).annotatedWith(Driver.class).to(Person.class).in(Singleton.class);
bind(Person.class).annotatedWith(Inventor.class).to(Person.class).in(Singleton.class);
Чтобы это работало, вы должны убедиться, что Person
не привязан к области Singleton явно в модуле Guice или к аннотации @Singleton
. Подробнее см. этот Gist .
Редактировать: Образец кода, который я привожу в качестве примера, взят из Guice Grapher Test . Просмотр тестов Guice - отличный способ лучше понять, как использовать API (что также применимо к каждому проекту с хорошими модульными тестами).