Серия новых функций Java8 (интерфейс)

Java

题图:by pixel2013 From pixabay

До Java 8 все методы интерфейса Interface были抽象方法и常量, а в Java8, что нового в интерфейсе?

статический элемент

До Java8 нам приходилось определять некоторые константы, обычно мы писали класс, в котором всеfinal staticВот некоторые из переменных:

public class Constants {
	public static final int MAX_SERVICE_TIME = 100;
}

public class Hello {
	public static void main(String[] args) {
		System.out.println(Constants.MAX_SERVICE_TIME);
	}
}

Поддержка интерфейса в Java8静态成员, член по умолчаниюpublic final staticДа, его можно вызывать прямо вне класса.

public interface MyInterface {
	int MAX_SERVICE_TIME = 100;
}

public class Hello {
	public static void main(String[] args) {
		System.out.println(MyInterface.MAX_SERVICE_TIME);
	}
}

функция по умолчанию

До Java8 функции интерфейса не могли быть реализованы следующим образом:

public interface MyInterface {
	int MAX_SERVICE_TIME = 100;

	void test();
}

В Java8 есть реализация функций поддержки в интерфейсе, если функции предшествуетdefaultКлючевого слова достаточно, как показано ниже:

public interface MyInterface {
	int MAX_SERVICE_TIME = 100;

	void test();
	
	default void doSomething() {
		System.out.println("do something");
	}
}

defaultФункция, класс реализации может не реализовывать этот метод.Если вы не хотите, чтобы некоторые методы реализовывались подклассами, вы можете написать это какdefaultфункция.

До Java8, если мы хотели реализовать такую ​​функцию, был способ, то есть определитьInterface, затем определитеAbstract ClassвыполнитьInterface, а затем определитьClassнаследоватьAbstract Class,такClassне нужно реализовыватьInterfaceВсе методы в .

статическая функция

Разрешить определение интерфейса в Java8staticметод, который позволяет разработчикам API определять в интерфейсе статические служебные методы, такие как getInstance, которые могут сделать API кратким и лаконичным, как показано ниже:

public interface MyInterface {
	default void doSomething() {
		System.out.println("do something");
	}
}

public class MyClass implements MyInterface {

}

public interface MyClassFactory {
	public static MyClass getInstance() {
		return new MyClass();
	}
}

Аннотация @FunctionalInterface

  • что函数式接口?

Функциональный интерфейс на самом деле является интерфейсом, но это особый интерфейс: интерфейс типа SAM (Single Abstract Method). Этот тип интерфейса определен таким образом, что методы, принимающие его в качестве параметров, могут вызываться сLambdaвыражение в качестве параметра.

@FunctionalInterface
public interface MyInterface {
	void test();
}

@FunctionalInterfaceАннотации могут помочь нам определить, является ли интерфейс функциональным интерфейсом, но эта аннотацияЭто не обязательно, и об ошибке не будет сообщено, если он не будет добавлен..

@FunctionalInterface
public interface MyInterface {//报错
	void test();

	void doSomething();
}

Интерфейс в非default/static方法都是abstract的, поэтому приведенный выше интерфейс не является функциональным интерфейсом, добавление @FunctionalInterface подскажет нам, что это не функциональный интерфейс.

  • Какова роль функционального интерфейса?

Функциональный интерфейс можно вызвать с помощью лямбда-выражения в качестве параметра.

Поэтому следующей особенностью Java8 является лямбда-выражение, пожалуйста, смотрите подробное объяснение в следующий раз.

Публичный аккаунт WeChat:На мечеПожалуйста, обратите внимание на мою личную технологию общедоступного аккаунта WeChat, подпишитесь на дополнительный контент