Должны ли Провайдеры Guice аннотироваться с помощью @Singleton
? Мое оправдание: если Поставщик предоставляет объект другим классам Singleton, а сам объект относительно дорог для создания, то не имеет смысла использовать провайдер Singleton, который строит дорогостоящий объект в своем конструкторе @Inject
-marked, сохранить его как члена и просто вернуть эту уже сохраненную глобальную переменную в getter? Что-то вроде этого:
@Singleton
public class MyProvider extends Provider<ExpensiveObject> {
private ExpensiveObject obj;
@Inject
public MyProvider() {
/* Create the expensive object here, set it to this.obj */
}
@Override
public ExpensiveObject get() {
return obj;
}
}
Update
Позвольте мне пояснить немного больше здесь. Речь идет не о том, следует ли использовать @Singleton
или .in(Singleton.class)
. Это должно сделать больше с "кэшированием" созданного объекта.
Предположим, что для создания объекта потребовалось несколько RPC для завершения, например десериализация JSON или создание HTTP-запросов. Это может занять довольно много времени. Если я собираюсь использовать этот Провайдер для ввода в классы несколько раз, то разве не имеет смысла только создавать такой объект один раз?
Также обратите внимание, что я должен иметь возможность использовать Провайдера, потому что мне нужно иметь возможность вводить в Провайдер.