Java接口中的私有方法

时间:2020-01-09 10:34:52  来源:igfitidea点击:

在Java 8中,在JavaDefault方法和静态方法的接口中添加了两个新功能。 Java 9新增了一项向Java接口添加私有方法的功能。

Java接口私有方法

可以使用private修饰符在Java接口中定义私有方法,方法与对Java类进行定义的方法相同。

private methodName(arguments){
  ..
  ..
}

我们可以在接口(从Java 9开始)中添加私有方法和私有静态方法。

为什么我们需要接口中的私有方法

随着默认和静态方法的加入,接口中出现了一个问题。如果默认方法或者静态方法中有通用代码怎么办?如果没有将通用代码暴露给实现类,就没有适当的方法将通用代码保存在单独的方法中。我们只能将通用代码保留在另一个默认或者静态方法中,但是默认情况下,接口中的所有方法都是公共的,因此将任何此类代码公开给实现类。

考虑以下情况,在Java 8中就是这种情况

public interface MyInterface {
  default void method1(){
    commonCode();
    System.out.println("In method 1");
  }

  default void method2(){
    commonCode();
    System.out.println("In method 2");
  }

  default void commonCode(){
    System.out.println("Executing common code...");
  }
}

这里,接口中有两个默认方法method1()和method2()。两种方法都执行一些通用代码,因此将其保存在单独的默认方法中,以避免重复代码。

但是任何实现此接口的类都可以访问commonCode()方法,因为默认情况下所有方法在Java 8之前都是公共的。另一种选择是在这两种方法中保持相同的代码,从而具有代码冗余性。

public class MyClassImpl implements MyInterface {
  public static void main(String[] args) { 
    MyClassImpl obj = new MyClassImpl();
    obj.commonCode();
  }
}

从Java 9开始,通过在Java接口中包含私有方法,我们可以将此类代码保留在私有方法中,该私有方法仅在接口中可见。通过避免代码冗余来提高代码的可重用性,并通过保持代码的私有性来保持代码的安全。

与commonCode()相同的接口与私有方法相同(可能从Java 9开始)。

public interface MyInterface {
  default void method1(){
    commonCode();
    System.out.println("In method 1");
  }

  default void method2(){
    commonCode();
    System.out.println("In method 2");
  }

  private void commonCode(){
    System.out.println("Executing common code...");
  }
}

现在,任何实现此接口的类都不能访问commonCode()方法,因为它是私有的。

Java接口中私有方法的规则

  • 接口中的私有方法必须具有方法主体,不能仅仅将其声明为我们通常在接口中使用的普通公共抽象方法。如下声明私有方法会导致编译时错误"此方法需要主体而不是分号"。
private void commonCode();
  • 从以上几点可以明显看出,private和abstract修饰符不能一起使用。
  • 如果要从接口中的静态方法访问私有方法,则该方法必须是私有静态方法,因为我们不能静态引用非静态方法。例如,如果接口中包含以下代码,则将收到编译时错误"无法从MyInterface类型对非静态方法commonCode()进行静态引用"。
static void method3() {
  commonCode();
}

private void commonCode(){
  System.out.println("Executing common code...");
}

私有方法应编写如下,以便可以从静态上下文访问它。

private static void commonCode(){
  System.out.println("Executing common code...");
}
  • 也可以从非静态上下文中使用私有静态方法,这意味着可以从接口中的默认方法调用私有静态方法。

Java接口的演变

这是Java接口中添加的功能的摘要,以及Java接口中现在可以使用的所有功能。