2014-02-19 6 views
1

Я читал много о интерфейсах в java. Я знаю, что вы можете добиться полиморфизма и других отличных вещей (указатели функций .. и т.д.). У меня есть теоретические знания, но они немного правы или даже нет. Я использую много уже сделанных интерфейсов, таких как «Runnable» или множество «Listeners». Но все же я не понимаю их на 100%. Если кто-то ответит на следующий вопрос, возможно, я получу лучшее понимание:Inteface. Почему полезно в этом случае

Так недавно я узнал о LibGdx, и я встретил интерфейс под названием «Одноразовый». Он имеет один метод под названием «dispose()», и документация для этого метода говорит;

Освобождает все ресурсы от этого объекта.

Так я предполагаю, что этот интерфейс объявлен как это:

public interface Disposable { 

public void dispose(); 

} 

И у меня есть класс, который реализует этот интерфейс.

public class Main implements Disposable { 

@Override 
    public void dispose() { 
     // TODO Auto-generated method stub 

    } 

} 

Вопрос: Как этот метод может сделать что-то, если он вызван, если он пуст? Он ничего не может распоряжаться ..

Я мог бы иметь свой собственный метод в этом классе, который будет распоряжаться объектами. Зачем нужен интерфейс для этого?

Это всего лишь пример. Я столкнулся с большим количеством подобных интерфейсов.

Я действительно не понимаю Интерфейсы, подобные этому.

Любая помощь appriciated.

ответ

1

Часто библиотеки предоставляют интерфейсы, поэтому вы можете расширить интерфейс, а не изменять внутренний код. это будет поддерживать совместимость кода, который использует библиотеку.

Предоставление пустой реализации зависит от разработчика, но в документации по интерфейсу они обеспечивают то, что должно быть фактической реализацией конкретного класса, который реализует интерфейс.

1

Возможные причины для Вашего случая использования:

  1. Вы можете позже изменить реализацию класса и на самом деле нужно что-то утилизировать. Код клиента не должен изменяться.
  2. Этот класс может быть частью большого массива или коллекции различных вещей, многие из которых необходимо утилизировать. Позволяет использовать более унифицированный код.
  3. Весь код клиента должен необходимо сделать, это позвонить по телефону dispose. Это полезно в шаблоне сборщика мусора, так что вы можете сделать garbageCollector.collect(disposable). Это имело бы смысл, если бы интерфейс был частью некоторого пакета GarbageCollector.
  4. Иногда языковые функции используют реализованные методы. try-with-resources - для этого требуется только close и для сравнения требуется AutoCloseable, see here.
1

Причина в том, что если у вас есть метод другого объекта, который принимает тип «Одноразовый», он ожидает (действительно требует), чтобы существовал метод, указанный интерфейсом. Вероятно, потому, что он вызовет этот метод где-нибудь.

Таким образом, вы можете иметь несколько классов, которые реализуют одноразовые (каждый по-своему), а затем вы можете передавать экземпляры этого класса через свой одноразовый интерфейс, который будет раскрывать любые методы, которые задает интерфейс. И класс, получающий экземпляр одноразового использования, может зависеть от того, что этот метод существует.

0

Проблема в том, что у вас может быть много разных типов объектов, все из которых хотят быть утилизированными. Теперь вы можете написать себе красивую серию операторов if-else, пытаясь определить, является ли данный Object экземпляром какого-либо другого типа объекта, чтобы вы могли определить, как он должен быть удален (и какие методы он может потребовать для его запуска) или вы можете, как вы здесь, определить общий interface, который может использовать все объекты, желающие быть удаленными в какое-то время.

Это означает, что вы можете обратиться к каждому из этих разных объектов на основе этого единственного общего interface, позволяющего им появляться как экземпляры Disposable, это краеугольный камень полиморфизма.

Это означает не более чем список объектов Disposable, вы можете легко и быстро вызвать метод dispose каждого из них. Вызывающему не волнует, как это реализовано, только когда он вызывается, требуемый контракт выполняется ...

0
There is a term in Java "Coding to Interfaces". 

Check the link: 
http://stackoverflow.com/questions/1970806/coding-to-interfaces 

Coding to an interface rather than to implementation. This makes your software/application easier to extend. In other words, your code will work with all the interface’s subclasses, even ones that have not been created yet. 
Anytime if you are writing code that interacts with subclasses, you have two choices either; your code directly interacts with subclasses or interacts with interface. Like this situation, you should always favor/prefer to coding to an interface, not the implementation. 
To use the interface one can simply call the methods on an instance of the concrete class. 

One would call the methods on a reference of the type interface, which happens to use the concrete class as implementation: 

List<String> l = new ArrayList<String>(); 
l.add("foo"); 
l.add("bar"); 
If you decided to switch to another List implementation, the client code works without change: 

List<String> l = new LinkedList<String>(); 
This is especially useful for hiding implementation details, auto generating proxies, etc. 

Advantages 

App/Software is easier to extend 
Adds Flexibility to your App. 
Helps to maintain the loose coupling of code. 
0

Интерфейс так же, как прототип для вашего класса. Целью является создание структуры для вашего класса.

Если ваш класс реализует какой-либо интерфейс, это означает, что класс должен объявить все свойство (то есть метод), определенное в интерфейсе. Его можно назвать прилагательным вашему классу.

Как, если у вас есть два класса, то есть Eagle и Parrot. Затем вы должны создать интерфейс с именем canFly. Теперь Орёл и попугай могут летать, но способ, которым они летают, может быть другим. Вот почему интерфейс не имеет декларации.

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