functional interfaces

Функциональные интерфейсы — новое в Java 8

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

Для начала нужно вспомнить что такое интерфейс. О нем мы говорили в статье «Основы ООП» и тогда я сказал, что в интерфейсе может быть только объявление методов, которые должны быть реализованы в классах, которые имплементировали интерфейс. Это не совсем так. Дело в том, что в версии Java 8 стал доступны так называемые функциональные интерфейсы, в которых возможно наличие уже реализованных методов. Вот как выглядит данный интерфейс:

Код    
  1. package com.interfaces;
  2.  
  3. @FunctionalInterface
  4. public interface FunctionalInterfaceExample {
  5.    
  6.     void someMethod();
  7.    
  8.     static void printGreetings(String name) {
  9.         System.out.println("Welcome " + name);
  10.     }
  11.    
  12.     default String returnGreetings(String name){
  13.         return "Welcome " + name;
  14.     }
  15.  
  16. }

Аннотацию @FunctionalInterface можно не писать. Ошибки не будет. Для того, чтобы объявить метод с реализацией нужно использовать ключевые слова static или default. Вы можете увидеть, что в данном интерфейсе есть один метод без реализации. По сути дела, интерфейс уже стал полноценным абстрактным классом.

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

Код    
  1. package com.interfaces;
  2.  
  3. public class FunctionalInterfaceImpl implements FunctionalInterfaceExample{
  4.  
  5.     public static void main(String[] args) {
  6.         FunctionalInterfaceImpl f = new FunctionalInterfaceImpl();
  7.         System.out.println(f.returnGreetings("javamaster"));
  8.         FunctionalInterfaceExample.printGreetings("javamaster");
  9.  
  10.     }
  11.    
  12.    
  13.    
  14.    
  15.     public String returnGreetings(String name) {
  16.         return "Bue " + name;
  17.     }
  18.  
  19.     @Override
  20.     public void someMethod() {
  21.         // TODO Auto-generated method stub
  22.        
  23.     }
  24.  
  25.  
  26.  
  27.  
  28.     @Override
  29.     public void someMethod1() {
  30.         // TODO Auto-generated method stub
  31.        
  32.     }
  33.  
  34. }

Результат выполнения:

Bue javamaster
Welcome javamaster

Как видите в примере, мы можем переопределять уже реализованные методы на наши или может оставить как есть. Можно даже не писать сам метод в классе. Ошибки компиляции не будет.

Если какой-либо класс в иерархии имеет метод с той же сигнатурой, то методы по умолчанию становятся неуместными. Поскольку в любом классе, реализующем интерфейс, уже есть Object как суперкласс, (все классы унаследованы от Object) если в интерфейсе есть методы equals (), hashCode () тогда будет ошибка компиляции. Вот почему для лучшей ясности интерфейсам не разрешено использовать методы по умолчанию класса Object.

Вот такая небольшая заметка, которая показала, как и когда использовать функциональные интерфейсы.

Добавить комментарий