Я знаю два способа использования интерфейса.Варианты использования между реализациями интерфейса
public interface MyInterface {
void myMethod();
}
подход: Использование
implements
:public class MyClass implements MyInterface { @Override myMethod(){} }
Я использую интерфейс таким способом большую часть времени, если интерфейс представляет собой договор, как:
MyInterface foo = new MyClass();
Теперь я могу управлять MyClass с помощью предоставленных методов интерфейса. Это также хорошо для коллекций. Если есть некоторые классы, которые реализуют
MyInterface
У меня есть общая нить:List<MyInterface> list = new ArrayList<MyInterface>();
подхода: Использование его в качестве
anonymous class
:public class MyClass { public MyInterface myInterface = new MyInterface(){ @Override public void myMethod(){} }; }
Этого подход я использую для обратных вызовов с dependcy инъекции, как это :
public class MyOtherClass { public MyInterface myInterface; // Using setter injection here public void setInterface(MyInterface interface){ myInterface = interface; } }
MyOtherClass зовет
myInterface.myMethod()
где это уместно.
Обратный вызов может быть реализован с использованием первого подхода с использованием this pointer
. Теперь я хотел бы знать, какой подход следует использовать для обратного вызова и почему? Я видел и то и другое, и я не знаю, где настоящая выгода.
Как я вижу, это единственное отличие, в котором я могу выбирать между первым и вторым подходами. Если я ошибаюсь, пожалуйста, скажите мне другую разницу. Я прошу об этом, чтобы выбрать подходящий инструмент для разных ситуаций.
Кроме того, я хотел бы узнать другую ситуацию, но обратный вызов, где я могу использовать второй подход.
Это две разные вещи. Первый подход использует наследование, тогда как второй подход использует композицию. Выбор либо зависит от того, что более значимо в контексте вашего интерфейса и классов. – shyam
@shyam Это именно тот момент, когда я потерялся, чтобы найти правильный контекст. –