Ситуация: мне нужно ленивое инстанцирование зависимости в некоторых FooClass
, таким образом, я передаю Injector
к классу как параметр конструктора.
private final Injector m_injector;
public FooClass(@Named("FooInjector") Injector injector) {
m_injector = injector;
}
Но облик не разрешает связывать базовые классы (инжекторы, модули и и т.д.). Каково решение?
Да,!! var используется при необходимости 0 | | 1 возвращаемого значения.
Одним из них является простое сравнение значений bool, когда вы хотите, чтобы "a = = b" было эквивалентно "a xor not b", за исключением того, что a = 5 и b = 7 оба будут истинными, но не равными.
Другое дело, когда вы хотите принудительно ввести набор условий в биты переменной:
var BIT_NONEMPTY=1;
var BIT_HASERRORS=2;
var BIT_HASCHILDREN=4;
var BIT_HASCONTENT=8;
result_bitfields =
(!!countLines())*BIT_NOTEMPTY +
(!!errorCode())*BIT_HASERRORS +
(!!firstChild())*BIT_HASCHILDREN +
(!!getContent())*BIT_HASCONTENT;
Не очень полезно в Javascript, который живет довольно далеко от битовых значений, но может быть полезно иногда.
-121--2088981-Наиболее простой вариант - предоставление списка в качестве одного из следующих IEnumerable , ICollection ReadOneyCollection через общедоступное свойство.
Таким образом, вы можете создать свой собственный тип
списка, в котором Позиции
представлены как один из вышеуказанных, но имеется внутренний метод добавления, например,
public class MyList<MyType>
{
private List<MyType> items;
public MyList()
{
items = new List<MyType>();
}
public IEnumerable Items { get { return items.AsEnumerable(); } }
public Add(MyType item)
{
// do internal processing
items.Add(item);
}
}
-121--1524248- Вы не должны использовать инжектор
непосредственно Вместо этого передайте в Provider < FooClass >
. Кроме того, необходимо ввести провайдера в местах, где используется FooClass
.
private final Provider<FooClass> provider;
@Inject
public ClassWhereFooIsUsed(Provider<FooClass> provider) {
this.provider = provider;
}
.... somewhere else
FooClass f = provider.get(); // This is lazy
Измените команду на абсолютную вместо относительной pat. EG:
cmake ~/workspace/project/src && make
-121--1607283- Некоторые функции Printexc позволяют выполнять это программно.
-121--1486399- Как сказал @ gpampara, Поставщик < T >
должен использоваться для ленивой/необязательной инициализации. Кроме того, как я сказал в своем ответе на ваш другой вопрос, вы должны избегать ссылок на Инжектор
в вашем коде почти во всех случаях.
Это означает, что в классе, созданном Guice, Инжектор
, который создает объект, может быть введен просто путем объявления зависимости от Инжектора
. Инжектор
автоматически доступен для инъекции без объявления для него какой-либо привязки.
Если вы вводите инжектор
, вам следует подумать о том, ПОЧЕМУ вы хотите это сделать. Почему бы просто не объявить зависимости от фактических интерфейсов/классов, от которых зависит класс? Добавить новую зависимость к конструктору так же просто, как и получить экземпляр некоторой зависимости через Injector
в другом месте кода, и это также делает код более понятным.