我一直在理解依赖注入(或者说是它的好处)方面存在问题。因此,我决定编写两个简单的代码片段,一个没有使用 DI,另一个使用了 DI。
我有一个类 A
public class A {
public void foo(){
B b = new B();
b.fooB();
}
}
可以看到,
A
取决于B
,B
是...public class B {
public void fooB(){
Log.e("s", "y");
}
}
我们可以使用 A
来做什么:
public void do(){
A a = new A();
a.foo();
}
但是据说A
不应该简单地初始化B
,因为它依赖于它,然而我们应该有一个服务,在两个类之间建立某种契约。例如,请告诉我如果我错了。
因此,让我们拥有一个接口BService
。
public interface BService {
void fooB();
}
然后B
变成DiB
public class DiB implements BService {
@Override
public void fooB(){
Log.e("s", "y");
}
}
并且 A
变成了 DiA
public class DiA {
BService bService;
public DiA(BService bService){
this.bService = bService;
}
public void foo(){
bService.fooB();
}
}
我们可以像这样使用A
public void dIdo(){
BService service = new diB();
diA a = new diA(service);
a.foo();
}
我阅读了关于DI的好处:
- 可测试的代码:因为我可以在JUnit中测试两个代码(我不想在此处发布测试以避免冗长的问题)
- 解耦:据说如果类
B
更改,则不应影响A
,但我无法理解,因为如果我在类B
中将fooB()
更改为fooB2()
,那么我将不得不更改BService
中的覆盖方法,这反过来意味着我将不得不在类A
中进行更改
这两个代码似乎都很好用,我无法理解其中一个胜过另一个的好处,只是另一个更加复杂。所以,请您在这个简单的A
和B
类的上下文中更详细地解释一下好处。我没有理解到什么?