2013-11-14 2 views
1

Я знаю два способа использования интерфейса.Варианты использования между реализациями интерфейса

public interface MyInterface { 
    void myMethod(); 
} 
  1. подход: Использование implements:

    public class MyClass implements MyInterface { 
    
        @Override 
        myMethod(){} 
    
    } 
    

    Я использую интерфейс таким способом большую часть времени, если интерфейс представляет собой договор, как:

    MyInterface foo = new MyClass(); 
    

    Теперь я могу управлять MyClass с помощью предоставленных методов интерфейса. Это также хорошо для коллекций. Если есть некоторые классы, которые реализуют MyInterface У меня есть общая нить:

    List<MyInterface> list = new ArrayList<MyInterface>(); 
    
  2. подхода: Использование его в качестве 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. Теперь я хотел бы знать, какой подход следует использовать для обратного вызова и почему? Я видел и то и другое, и я не знаю, где настоящая выгода.

Как я вижу, это единственное отличие, в котором я могу выбирать между первым и вторым подходами. Если я ошибаюсь, пожалуйста, скажите мне другую разницу. Я прошу об этом, чтобы выбрать подходящий инструмент для разных ситуаций.

Кроме того, я хотел бы узнать другую ситуацию, но обратный вызов, где я могу использовать второй подход.

+0

Это две разные вещи. Первый подход использует наследование, тогда как второй подход использует композицию. Выбор либо зависит от того, что более значимо в контексте вашего интерфейса и классов. – shyam

+0

@shyam Это именно тот момент, когда я потерялся, чтобы найти правильный контекст. –

ответ

1

Выбор с помощью имени или анонимная реализация интерфейса зависит от нескольких вещей:

  • Планируют ли Вы повторно использовать некоторые логики в реализации? - Если ответ «да», используйте первый подход; в противном случае используйте второй подход.
  • Вам нужно реализовать сложную логику с большим количеством внешних взаимодействий? - Если ответ «да», используйте первый подход; в противном случае используйте второй подход.
  • Имеет ли ваш интерфейс несколько методов, некоторые из которых могут осмысленно ничего не делать? - Если ответ «да», используйте первый подход или создайте класс «по умолчанию» со всеми реализациями, которые ничего не делают; в противном случае используйте второй подход.

В конце концов, самая большая разница между этими двумя подходами в основном нетехническая: она связана с читабельностью вашего результирующего кода. В конце концов, анонимные классы немного больше, чем «синтаксический сахар» - вы можете прекрасно реализовать свою систему только с именованными классами.Если вы считаете, что названная реализация читается лучше, используйте первый подход; если вы считаете, что анонимный работает лучше, используйте второй подход.

+0

В общем, названная реализация должна быть предпочтительной в пользу повторного использования? –

+0

@SteveBenett Иногда просто нет возможности повторного использования, например, когда ваш класс является простым кабелепроводом, обеспечивающим «логику клеев» для соединения обратного вызова с помощью метода или двух, выполняя «тяжелый подъем». Однако, если вы считаете, что код обратного вызова, который вы пишете, можно использовать повторно, вам обязательно нужно пойти по именованному классу. Один из способов узнать наверняка, если вы видите, что вы копируете код из одного анонимного класса в другой анонимный класс. – dasblinkenlight

Смежные вопросы