Методы по умолчанию в Java 8

Java 8 新特性Новые возможности Java 8


В Java 8 были введены методы по умолчанию для интерфейсов.

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

Нам просто нужно добавить ключевое слово default перед именем метода, чтобы реализовать метод по умолчанию.

Зачем нужна эта возможность?

Во-первых, предыдущий интерфейс был палкой о двух концах. Преимущество в том, что он ориентирован на абстракцию, а не на конкретное программирование. Недостаток в том, что когда интерфейс нужно изменить, все классы, реализующие этот интерфейс, должны быть изменены. Фреймворк коллекций до Java 8 не имел метода foreach. Обычное решение, которое можно придумать, — добавить новые методы и реализации в соответствующие интерфейсы в JDK. Однако для уже выпущенных версий нет способа добавить новые методы в интерфейс, не затрагивая существующие реализации. Поэтому были введены методы по умолчанию. Их цель — решить несовместимость между изменениями интерфейса и существующими реализациями.

Синтаксис

Синтаксис метода по умолчанию выглядит следующим образом:

public interface Vehicle { default void print(){ System.out.println("Я машина!"); } }

Несколько методов по умолчанию

Если интерфейс имеет метод по умолчанию, рассмотрим ситуацию, когда класс реализует несколько интерфейсов, и эти интерфейсы имеют один и тот же метод по умолчанию. Следующий пример иллюстрирует решение этой ситуации:

public interface Vehicle { default void print(){ System.out.println("Я машина!"); } } public interface FourWheeler { default void print(){ System.out.println("Я четырёхколёсное транспортное средство!"); } }

Первое решение — создать собственный метод по умолчанию, чтобы переопределить метод по умолчанию интерфейса:

public class Car implements Vehicle, FourWheeler { default void print(){ System.out.println("Я четырёхколёсный автомобиль!"); } }

Второе решение — использовать super для вызова метода по умолчанию указанного интерфейса:

public class Car implements Vehicle, FourWheeler { public void print(){ super.print.print(); } }

Статические методы по умолчанию

Ещё одна особенность Java 8 заключается в том, что интерфейсы могут иметь (и предоставлять реализации) методы по умолчанию. Например:

public interface Vehicle { default void print(){ System.out.println("Я — !"); } //Статические методы static void blowHorn(){ System.out.println("Погудите!!!"); } }

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

Мы можем понять использование методов по умолчанию из следующего кода. Вы можете поместить код в файл Java8Tester.java:

Файл Java8Tester.java

public class Java8Tester { public static void main(String args[]){ Vehicle vehicle = new Car(); vehicle.print(); } } interface Vehicle { default void print(){ System.out.println("Я автомобиль!"); } static void blowHorn(){ System.out.println("Погудите!!!"); } } interface FourWheeler { default void print(){ System.out.println("Я четырёхколёсное транспортное средство!"); } } class Car implements Vehicle, FourWheeler { public void print(){ Vehicle.super.print(); FourWheeler.super.print(); Vehicle.blowHorn(); System.out.println("Я — автомобиль!"); } }

При выполнении приведённого выше скрипта результат вывода:

$ javac Java8Tester.java 
$ java Java8Tester
我是一辆车!
我是一辆四轮车!
按喇叭!!!
我是一辆汽车!

Java 8 新特性Новые возможности Java 8

Другие расширения