我有一个 Car
类,它扩展了 Vehicle
类,我将在车辆类中注入一些属性。例子 编辑
abstract class Vehicle {
@Inject
lateinit var default: Default
}
class Car @Inject constructor(): Vehicle() {
}
在我的代码中,一切都很正常。
但有一点我需要知道的是,匕首如何在基类或其层次结构中注入属性?
这是正确的注入方式吗?
谁能澄清一下?
但有一点我需要知道的是,匕首是如何在基类或其层次结构中注入属性的?
你可以看看生成的源文件。在你的情况下,会有类似的东西。
class Car_Factory implements Factory<Car> {
@Override
public Car get() {
return provideInstance(
defaultProvider
);
}
public static Car provideInstance(
Provider<Default> defaultProvider
) {
Car instance = new Car();
Vehicle_MembersInjector.injectDefault(instance, defaultProvider.get()); // just instance.default = default here
return instance;
}
}
如你所见,它将创建你的实例,然后访问它的字段(只要它们是公共的和可写的)。
这是正确的注入方式吗?
这不是推荐的方式,因为你暴露了字段,而这些字段可能是私有的(或受保护的),而且你让外面的人可以修改,这违反了封装。
所以最好使用构造函数注入这种方式。
abstract class Vehicle(protected val default: Default)
class Car @Inject constructor(default: Default) : Vehicle(default)
这样Dagger就会用已经初始化的字段来创建你的实例,而不会去访问它们。