2016-09-05 3 views
10

В Java 8 мы можем иметь стандартные реализации для методов в интерфейсах, в дополнение к объявлениям, которые необходимо реализовать в конкретных классах.Добавление методов или не добавление методов к интерфейсу?

Является ли хорошим дизайном или лучшей практикой использовать методы по умолчанию в интерфейсе или вышла ли Java 8 только для обеспечения большей поддержки старых API? Должны ли мы начать с использования методов по умолчанию в новых проектах Java 8?

Пожалуйста, помогите мне понять, какой хороший дизайн здесь, в деталях.

+1

Вы говорите о применении метода 'default' метода? Нет другой возможности добавить * content * к методу в интерфейсах. – Zabuza

+0

http://www.tutorialspoint.com/java8/java8_default_methods.htm ... upvoted, потому что я не мог найти дубликат на SO. –

+0

Необходимо регулярно избегать использования методов по умолчанию IMHO, как для хорошей практики, и может сделать отладку немного жесткой, и если вы действительно хотите архивировать, что вы можете пойти с абстрактными классами, поскольку они обеспечивают такую ​​же функциональность –

ответ

-1

В более ранних версиях java не было возможно beacuase, у вас были абстрактные классы, чтобы использовать только конкретные и объявленные методы, но. Java 8 вводит новую функцию «Метод по умолчанию» или (Защитники), которая позволяет разработчику добавлять новые методы к интерфейсам без нарушения существующей реализации этого интерфейса. Он обеспечивает гибкость, позволяющую интерфейс определять реализацию, которая будет использоваться по умолчанию в ситуации, когда конкретный класс не может обеспечить реализацию для этого метода.

Пусть рассмотрит небольшой пример, чтобы понять, как это работает:

public interface oldInterface { 
    public void existingMethod(); 
     default public void newDefaultMethod() { 
     System.out.println("New default method" 
       " is added in interface"); 
    } 
} 

Следующий класс будет успешно компилируется в Java JDK 8

public class oldInterfaceImpl implements oldInterface { 
    public void existingMethod() { 
     // existing implementation is here… 
    } 
} 

Почему УСПЕШНЫЙ метод? Реинжиниринг существующей структуры JDK всегда очень сложный. Изменение одного интерфейса в JDK-инфраструктуре разбивает все классы, расширяющие интерфейс, что означает, что добавление любого нового метода может сломать миллионы строк кода. Поэтому методы по умолчанию введены в качестве механизма для расширения интерфейсов с обратной совместимостью.

ПРИМЕЧАНИЕ:

Однако мы можем achive это назад compatability.but его всегда рекомендуется использовать интерфейсы с delarations только то, что они лучше всего использовать для.

Для простого примера, если у вас есть interface Human_behaviour вы можете использовать все действия этого интерфейса, как to_Walk(); to_Eat(), to_Love(), to_Fight() сказать, например, в каждом классе, реализующем уникальным образом для каждого человека объекта .like

Один человек может сражаться с помощью Мечей и другого объекта, используя оружие и так далее. Таким образом, интерфейс является благом, но всегда может использоваться в соответствии с потребностями.

2

До java8, вы смотрели в сторону versioned capabilities, когда речь идет о «разумных» способы расширения интерфейсов:

У вас есть что-то вроде:

interface Capability ... 

interface AppleDealer { 
    List<Apples> getApples(); 
} 

и для того, чтобы извлечь AppleDealer, есть некоторая центральная служба как

public <T> T getCapability (Class<T> type); 

Так что ваш код клиента будет делать:

AppleDealer dealer = service.getCapability(AppleDealer.class); 

Когда потребность другой метод подходит, вы идете:

interface AppleDealerV2 extends AppleDealer { ... 

И клиенты, которые хотят V2, просто сделать getCapability(AppleDealerV2.class) вызов. Те, которые не заботятся, не должны изменять свой код!

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

Таким образом: просто добавление метода к интерфейсу; и имеет по умолчанию для реализации этого метода прямо там; без нарушения существующего клиентского кода огромный шаг вперед!

Значение: почему бы вам не использовать по умолчанию методы на существующих интерфейсах? Существующий код все равно. Он не знает о новых дефолтных методах.

0

Метод по умолчанию в интерфейсе имеет некоторые ограничения. Вы не можете иметь переменные данных в интерфейсе. В общем случае причины по умолчанию были добавлены по следующей причине. Скажем, в вашей предыдущей версии вы написали класс, который реализует интерфейс «A». В вашей следующей версии вы решили, что было бы неплохо добавить метод к вашему интерфейсу «A». Но вы не можете этого сделать, так как любой класс, который реализует «A», теперь не будет иметь этого дополнительного метода и, следовательно, не будет компилироваться. Это будет ОСНОВНАЯ обратная совместимость. Таким образом, в Java 8 вы можете добавить реализацию метода по умолчанию в интерфейс, чтобы все классы, которые реализовали старую версию «A», не будут разбиты, но будут отступать от реализации по умолчанию. Поэтому используйте эту функцию экономно, только если вам действительно нужно расширить существующий интерфейс.

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