原文: https://howtodoinjava.com/java9/java9-private-interface-methods/

从 Java 9 开始,您可以在接口中包含私有方法。 使用私有方法,现在也可以在接口中实现封装

在此 Java 9 教程中,我们将详细了解接口私有方法

  1. Table of Contents
  2. Interfaces till Java 7
  3. Static and defaults methods since Java 8
  4. Private methods since java 9
  5. Java 9 Private Interface Method Example
  6. Summary

Java 7 接口

在 Java 7 和所有早期版本中,接口非常简单。 它们只能包含公共抽象方法。 这些接口方法必须由选择实现接口的类实现。

  1. public interface CustomInterface {
  2. public abstract void method();
  3. }
  4. public class CustomClass implements CustomInterface {
  5. @Override
  6. public void method() {
  7. System.out.println("Hello World");
  8. }
  9. public static void main(String[] args){
  10. CustomInterface instance = new CustomClass();
  11. instance.method();
  12. }
  13. }
  14. Output:
  15. Hello World

自 Java 8 以来的静态方法和默认方法

Java 8 中,除了公共抽象方法之外,您还可以使用公共静态方法和公共默认方法。

  1. public interface CustomInterface {
  2. public abstract void method1();
  3. public default void method2() {
  4. System.out.println("default method");
  5. }
  6. public static void method3() {
  7. System.out.println("static method");
  8. }
  9. }
  10. public class CustomClass implements CustomInterface {
  11. @Override
  12. public void method1() {
  13. System.out.println("abstract method");
  14. }
  15. public static void main(String[] args){
  16. CustomInterface instance = new CustomClass();
  17. instance.method1();
  18. instance.method2();
  19. CustomInterface.method3();
  20. }
  21. }
  22. Output:
  23. abstract method
  24. default method
  25. static method

访问修饰符public在以上所有接口方法声明中都是可选的。 我添加它们只是为了提高可读性。

自 Java 9 以来的私有方法

从 Java 9 开始,您将可以在接口中添加私有方法私有静态方法

这些私有方法将改善接口内部的代码可重用性。 举例来说,如果需要两个默认方法来共享代码,则可以使用私有接口方法来共享代码,但不必将该私有方法暴露给实现类。

在接口中使用私有方法有四个规则:

  1. 接口私有方法不能是抽象的。
  2. 私有方法只能在接口内部使用。
  3. 私有静态方法可以在其他静态和非静态接口方法中使用。
  4. 私有非静态方法不能在私有静态方法内部使用。
  1. public interface CustomInterface {
  2. public abstract void method1();
  3. public default void method2() {
  4. method4(); //private method inside default method
  5. method5(); //static method inside other non-static method
  6. System.out.println("default method");
  7. }
  8. public static void method3() {
  9. method5(); //static method inside other static method
  10. System.out.println("static method");
  11. }
  12. private void method4(){
  13. System.out.println("private method");
  14. }
  15. private static void method5(){
  16. System.out.println("private static method");
  17. }
  18. }
  19. public class CustomClass implements CustomInterface {
  20. @Override
  21. public void method1() {
  22. System.out.println("abstract method");
  23. }
  24. public static void main(String[] args){
  25. CustomInterface instance = new CustomClass();
  26. instance.method1();
  27. instance.method2();
  28. CustomInterface.method3();
  29. }
  30. }
  31. Output:
  32. abstract method
  33. private method
  34. private static method
  35. default method
  36. private static method
  37. static method

Java 9 接口私有方法示例

让我们看一个演示,以了解接口私有方法的用法。

我正在创建具有两个函数的计算器类。 第一个函数将接受一些整数并将所有偶数相加。 第二个函数将接受一些整数并将所有奇数相加。

CustomCalculator.java – 接口

import java.util.function.IntPredicate;
import java.util.stream.IntStream;

public interface CustomCalculator 
{
    default int addEvenNumbers(int... nums) {
        return add(n -> n % 2 == 0, nums);
    }

    default int addOddNumbers(int... nums) {
        return add(n -> n % 2 != 0, nums);
    }

    private int add(IntPredicate predicate, int... nums) { 
        return IntStream.of(nums)
                .filter(predicate)
                .sum();
    }
}

Main.java – 类

public class Main implements CustomCalculator {

    public static void main(String[] args) {
        CustomCalculator demo = new Main();

        int sumOfEvens = demo.addEvenNumbers(1,2,3,4,5,6,7,8,9);
        System.out.println(sumOfEvens);

        int sumOfOdds = demo.addOddNumbers(1,2,3,4,5,6,7,8,9);
        System.out.println(sumOfOdds);
    } 
}

Output:

20
25

总结

简而言之, java 9 私有接口方法可以是静态的也可以是实例的。 在这两种情况下,私有方法都不会被子接口或实现继承。 它们主要是为了提高代码仅在接口内的可重用性,从而改善封装。

让我们回顾一下 Java 9 中所有允许的方法类型。

方法类型 从何时起
公共抽象 Java 7
公共默认 Java 8
公共静态 Java 8
私有 Java 9
私有静态 Java 9

将您的问题放在评论部分中。

学习愉快!

参考: JEP 213

下载源码