Интерфейс обеспечивает полную абстракцию? Как? - PullRequest
0 голосов
/ 30 апреля 2018

Насколько я знаю, интерфейс обеспечивает полную абстракцию, потому что у него не может быть никакого конкретного метода, такого как абстрактный класс. Но из java 8 интерфейсы могут иметь конкретные методы, использующие ключевое слово по умолчанию, и классы, которые реализуют интерфейс, могут переопределять эти конкретные методы. Итак, действительно ли интерфейс обеспечивает полную абстракцию?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

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

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

На самом деле, хорошо разработанные методы по умолчанию не приносят много специфических (зависящих от реализации) вещей. Посмотрите на java.util.Comparator. Я бы не сказал, что такие методы, как thenComparing, naturalOrder, нарушают уровень абстракции, введенный в версии Java 1.2.

0 голосов
/ 30 апреля 2018

Вроде и нет, с появлением Java8 вы можете в основном использовать конкретные методы в интерфейсах.

Примерно так.

public interface IHelloWorld {
  public default void print() {
    System.out.println("Hello World");
  }
}

Теперь вы можете реализовать класс или анонимный класс, который реализует этот интерфейс и использовать print (), как если бы вы писали этот метод в абстрактном классе.

Важно:

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

Также вы не можете установить этот метод окончательным.

Невозможно сделать это:

public final default void print() {
    System.out.println("Hello World");
}

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

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

...