Sta*_*ack 4 android kotlin dagger dagger-2
我有一个Car
扩展类的类Vehicle
,我将在车辆类中注入一些属性。
示例 编辑
abstract class Vehicle {
@Inject
lateinit var default: Default
}
class Car @Inject constructor(): Vehicle() {
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中一切正常,
但我需要知道的一件事是,匕首如何将属性注入基类或其层次结构中?
这是正确的注射方式吗?
谁能澄清这一点吗?
但我需要知道的一件事是,匕首如何将属性注入基类或其层次结构中?
为此,您可以查看生成的源文件。在你的情况下会有类似的事情:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它将创建您的实例,然后访问它的字段(只要它们是公共且可写的)。
这是正确的注射方式吗?
不建议这样做,因为您公开了可能是私有(或受保护)的字段,并且允许外部其他人进行修改,这违反了封装。
因此,最好以这种方式使用构造函数注入:
abstract class Vehicle(protected val default: Default)
class Car @Inject constructor(default: Default) : Vehicle(default)
Run Code Online (Sandbox Code Playgroud)
通过这种方式,Dagger 将使用已初始化的字段创建您的实例,并且不会访问它们
归档时间: |
|
查看次数: |
955 次 |
最近记录: |