Java статически типизирован и динамически связывать .
Динамически связывать: Это означает, что связь между сигнатурой метода и его реализация происходит во время выполнения.Например.
Например
public interface MyInterface {
void doStuff();
}
public class MyFirstImpl implements MyInterface {
@Override
public void doStuff() {
// do some stuff here
}
}
public class MySecondImpl implements MyInterface {
@Override
public void doStuff() {
// do some stuff here
}
}
Так что, если у вас будет следующий фрагмент
MyInterface test; // pointing to either MyFirstImpl or MySecondImpl
test.doStuff();
JVM определит во время выполнения погоду для вызова doStuff
метод из MyFirstImpl
или MySecondImpl
в зависимости от типа объекта во время выполнения.
Статически напечатано: Это означает, что JVM проверит во время компиляции, существует ли метод дляЗвоните независимо от реализации.
Например:
public interface MyInterface {
void doStuff();
}
public class MyFirstImpl implements MyInterface {
// no override here
public void doStuff() {
// do some stuff here
}
}
public class MySecondImpl implements MyInterface {
// no override here
public void doStuff() {
// do some stuff here
}
}
Так что, если у вас будет следующий фрагмент
MyInterface test; // pointing to either MyFirstImpl or MySecondImpl
test.doStuff();
Компилятор будет жаловаться, потому что он не может гарантировать во время компиляции, что независимореализации MyInterface
есть метод doStuff
для вызова (хотя в этом случае обе реализации MyInterface
определяют метод doStuff
).
Это гарантирует, что вы не получитеNoSuchMethodException
во время выполнения, если вы пропустите, например, следующую реализацию.
public class MySecondImpl implements MyInterface {
// no override here
// no doStuff method
}
Это добавляет некоторую безопасность типов к языку ценой некоторой жесткости (поскольку вы можете определитьвыпускать раньше, чем во время выполнения, и поэтому у вас более короткий цикл обратной связи, за счет сценария, в котором все реализации фактически предоставляют метод, не работающий «из коробки».
Как следует выполнить рефакторингВаш код:
Создайте оболочку над сторонней библиотекой и откройте интерфейс из оболочки.
public interface Foo {
void bar();
}
public class ThirdPartyFooWrapper implements Foo {
private SomeOldClass oldClass;
public ThordPartyFooWrapper (SomeOldClass oldClass){
this.oldClass = oldClass;
}
@Override
public void bar() {
this.oldClass.bar();
}
}
Затем в своем коде используйте ThirdPartyFooWrapper
вместо SomeOldClass
.
Надеюсь, это ответит на ваш вопрос!