Статьи

Методы по умолчанию — подход к расширению устаревшего кода

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
public interface Dog {
    void bark();
  
    default void bite() {
        System.out.println("Biting Biting Biting");
    }
}
  
public class Husky implements Dog {
    @Override
    public void bark() {
        System.out.println("barking");
    }
  
    public static void main(String... args){
        Dog dog = new Husky();
        dog.bite();
        dog.bark();
    }
}

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

Причина метода по умолчанию

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

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

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

Некоторые моменты о методах по умолчанию

Есть некоторые моменты, которые вы должны знать, когда вы хотите использовать методы по умолчанию или вы хотите использовать коды, которые используют методы по умолчанию.

    • Расширение интерфейсов, содержащих методы по умолчанию:
      Если вы хотите расширить или реализовать интерфейс с методами по умолчанию, у вас есть три варианта методов по умолчанию.

      • Вы можете использовать их реализацию по умолчанию и игнорировать, чтобы переопределить их.
      • Вы можете переопределить его, так что это будет абстрактный метод.
      • Вы можете переопределить его, просто переопределив.
    • Множественное наследование с использованием методов по умолчанию: при использовании методов по умолчанию вы можете иметь классы, которые имеют смешанное поведение многих интерфейсов, но вы должны обратить внимание на важный момент.
      Если расширенные интерфейсы имеют общую сигнатуру метода, вы столкнетесь с ошибкой времени компиляции, поскольку существует две неоднозначности между двумя реализациями одной и той же сигнатуры метода. В этой ситуации вам потребуется переопределить метод и реализовать его с помощью собственного кода или выбрать один из методов по умолчанию.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public interface FirstInterface {
    default void doSomething(){
        System.out.println("Doing something from FirstInterface");
    }
  
}
  
public interface SecondInterface {
   default  void doSomething(){
       System.out.println("Doing something from SecondInterface");
   }
}
  
public class FirstImplementation implements SecondInterface,FirstInterface {
  
    @Override
    public void doSomething(){
        SecondInterface.super.doSomething();
    }
  
    public static void main(String... args){
        System.out.println("GGG");
  
        new FirstImplementation().doSomething();
    }
}