基类中的匕首注入是个好办法?

问题描述 投票:1回答:1

我有一个 Car 类,它扩展了 Vehicle 类,我将在车辆类中注入一些属性。例子 编辑

abstract class Vehicle {
    @Inject
    lateinit var default: Default
}

class Car @Inject constructor(): Vehicle() {

}

在我的代码中,一切都很正常。

但有一点我需要知道的是,匕首如何在基类或其层次结构中注入属性?

这是正确的注入方式吗?

谁能澄清一下?

android kotlin dagger-2 dagger
1个回答
3
投票

但有一点我需要知道的是,匕首是如何在基类或其层次结构中注入属性的?

你可以看看生成的源文件。在你的情况下,会有类似的东西。

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就会用已经初始化的字段来创建你的实例,而不会去访问它们。

© www.soinside.com 2019 - 2024. All rights reserved.