2016-03-09 3 views
4

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

public abstract class TestAbstractClass { 
    void commonMethod(){ 
     System.out.println("Calling common method : TestAbstractClass"); 
    } 
} 

вызова класса:

public class RunApplication extends TestAbstractClass{ 

    public void testMethod(){ 
     commonMethod(); 
    } 
} 

[OR]

Использование Java 8 особенностью метода по умолчанию в интерфейсе.

public interface TestInterface { 
    default void commonMethod(){ 
     System.out.println("Calling common method : TestInterface"); 
    } 
} 

вызова класс:

public class RunApplication implements TestInterface{ 

    public void testMethod(){ 
     commonMethod(); 
    } 
} 

Они оба прекрасно работают для меня, Но что лучше подход, абстрактный класс с неабстрактными методами или интерфейса с методом по умолчанию.

+0

Есть аргументы в пользу поддержки обоих. Лучше всего посмотреть на различия. Например, если вы когда-либо захотите, чтобы дочерний класс наследовал другой класс, расширение абстрактного класса - это не то, что вы хотите сделать. – Stultuske

+0

Такие вопросы не имеют смысла при переполнении стека - ответы действительно зависят от конкретной проблемы, которую вы должны решить. Здесь нет общего «того или другого». – GhostCat

+1

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

ответ

1

абстрактный класс или интерфейс

Если бы я тебя, я буду судить о целесообразности, проверяя, все ли эти классы , связанные или нет.

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

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

Пример:

Используя птицу и самолет в качестве примера. Птицы и самолеты оба летают. Но кроме этого, они не связаны вообще. Естественно, вы захотите реализовать интерфейс вместо использования абстрактного класса, потому что ни самолеты не являются птицами, ни птицами не являются самолетами.

class Bird implements Flyable 
{ 
    @Override 
    public void fly(){ 

    } 
} 

class Plane implements Flyable 
{ 
    @Override 
    public void fly(){ 

    } 
} 

Другой вопрос, чтобы рассмотреть множественное наследование. В Java множественное наследование класса недопустимо. Следовательно, если вы используете абстракцию, ваш подкласс не сможет распространяться на другой класс.

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

1

Это будет отзывчивая тема.

Мое мнение, что вы должны пойти с классом abstract: он обеспечивает общую функциональность для своих потомков.

метода по умолчанию в Java 8 интерфейсы может делать, что хорошо, но они рассчитаны на то несколько иначе:

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

(от documentation).

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

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

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

Примечание

Я не конкретизируя «абстрактного класса против интерфейса» типичной дихотомии здесь, как предполагается, вы знаете, плюсы и минусы.

+0

Ну, но вы можете реализовать интерфейс * и * подкласс из другого класса. Это не значит, что вы уже являетесь подклассом из абстрактного класса ... :) – hfhc2

+0

@ hfhc2, который относится к стандартному и хорошо известному абстрактному классу против дихотомии интерфейса. Я предполагаю, что ОП знает это уже. – Mena

1

Наследование в любой его форме предназначено для использования с полиморфизмом.

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

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