Все мы знаем, что интерфейсы в 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 .