Статьи

Введение в стандартные методы (методы Defender) в Java 8

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
public interface SimpleInterface {
  public void doSomeWork();
}
 
class SimpleInterfaceImpl implements SimpleInterface{
  @Override
  public void doSomeWork() {
    System.out.println('Do Some Work implementation in the class');
  }
 
  public static void main(String[] args) {
    SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl();
    simpObj.doSomeWork();
  }
}

Что теперь, если я добавлю новый метод в SimpleInterface?

1
2
3
4
public interface SimpleInterface {
  public void doSomeWork();
  public void doSomeOtherWork();
}

и если мы попытаемся скомпилировать код, мы получим:

1
2
3
4
5
6
$javac .\SimpleInterface.java
.\SimpleInterface.java:18: error: SimpleInterfaceImpl is not abstract and does not
override abstract method doSomeOtherWork() in SimpleInterface
class SimpleInterfaceImpl implements SimpleInterface{
^
1 error

И это ограничение делает практически невозможным расширение / улучшение существующих интерфейсов и API. С такой же проблемой столкнулся при расширении API коллекций в Java 8 для поддержки лямбда-выражений в API. Чтобы преодолеть это ограничение, в 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
public interface SimpleInterface {
  public void doSomeWork();
 
  //A default method in the interface created using 'default' keyword
  default public void doSomeOtherWork(){
    System.out.println('DoSomeOtherWork implementation in the interface');
  }
}
 
class SimpleInterfaceImpl implements SimpleInterface{
  @Override
  public void doSomeWork() {
    System.out.println('Do Some Work implementation in the class');
  }
  /*
   * Not required to override to provide an implementation
   * for doSomeOtherWork.
   */
 
  public static void main(String[] args) {
    SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl();
    simpObj.doSomeWork();
    simpObj.doSomeOtherWork();
  }
}

и вывод:

1
2
Do Some Work implementation in the class
DoSomeOtherWork implementation in the interface

Это очень краткое введение в стандартные методы. Подробнее о методах по умолчанию можно прочитать здесь .

Ссылка: Введение в Методы по умолчанию (Методы Защитника) в Java 8 от нашего партнера JCG Мохамеда Санауллы в блоге Experiences Unlimited .