gpt4 book ai didi

java - 从维护的角度来看,实现属性注入(inject)与构造函数注入(inject)是否更优化?

转载 作者:行者123 更新时间:2023-11-30 10:49:38 25 4
gpt4 key购买 nike

假设我有以下类和 Dagger 模块

public class Base implements IBase {
private IDependency dependency; //IDependency is an interface

Base(IDependency dependency) {
this.dependency = dependency
}
}

public class SubClass extends Base implements ISubclass {
Base(IDependency dependency) {
super(dependency)
}
}

@Module
public class MyModule {

// Let's assume some other class use SubClass and requires this
@Provides
ISubclass providesSubclass(IDependency dependency) {
return new SubClass(dependency);
}
}

如果我向 Base 构造函数添加一个新参数,我将不得不转到 MyModule 并修改 provides 方法以包含这个新参数(除了明显改变 BaseSubclass 构造函数)。在我看来,使用 propery 注入(inject)我没有这个问题,因为我没有使用任何构造函数。

我的感觉是我可能做错了什么或者我的概念有误。我更喜欢构造函数注入(inject)而不是属性注入(inject),但现在我必须向 40 个其他类使用的基类添加一个构造函数参数,不仅我必须修改这 40 个类的构造函数,我还必须修改模块以反射(reflect)新的构造函数参数。

我错过了什么吗?如果我说执行构造函数注入(inject)我会写更少的代码并且维护会更容易,我是否正确?

最佳答案

是的,您缺少一些很棒的功能:在这种情况下您仍然可以使用构造函数注入(inject)!而且您甚至不必自己编写它。

如果可以提供所有依赖项,dagger 可以并且会为您创建对象。鉴于您可以提供 IDependency,您只需要像下面这样修改您的代码:

public class SubClass extends Base implements ISubclass {

@Inject // Don't forget the annotation!
public Base(IDependency dependency) {
super(dependency)
}
}

@Module
public class MyModule {

@Provides
ISubclass providesSubclass(SubClass subclass) {
return subclass;
}
}

提供接口(interface),但您依赖实现来提供它。 Dagger 将解决这个问题,您可以根据需要愉快地向构造函数添加任意数量的参数。 (除了您已经指出的对实际构造函数的明显更改之外)

不要忘记 @Inject 注解!

关于java - 从维护的角度来看,实现属性注入(inject)与构造函数注入(inject)是否更优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35341122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com