У меня были проблемы с захватом инъекций зависимостей (или позвольте мне сказать, что это полезно).Поэтому я решил написать два простых кода: один без 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 это не должно повлиять, и я не могу понять это, потому что если я изменю fooB() в классе B на fooB2 (), мне придется изменить метод переопределения в BService, что, в свою очередь, означает, что мне придется изменить его в классе A
Кажется, что оба кода работают нормально, и яЯ не могу понять преимущества одного над другим, только то, что другой является более сложным.Поэтому, пожалуйста, не могли бы вы рассказать мне больше о преимуществах в контексте этих простых классов А и В.Что я не получаю?