従来のJavaプログラミングでは、よく知られている知識のポイントは、プライベートメソッドをJavaインターフェイスインターフェイスで定義できないことです。パブリックアクセスメソッド、抽象メソッド、または静的メソッドのみを定義できます。ただし、Java 9以降、インターフェイスではプライベートメソッドとプライベート静的メソッドを定義できます。以下では、その文法規則と、そのような設計がある理由を紹介します。
実際、Java 8より前には、広く知られているもう1つの知識ポイントがあります。インターフェース内のすべてのメソッドは抽象メソッドでなければなりません。ただし、Java 8以降では、次のテキストのデフォルトメソッドなど、非抽象メソッドをインターフェイスに含めることができます。これは、この記事で紹介したいことではありません。慣れていない場合は、独自のレッスンを作成してください。
1つは、Java9インターフェースがプライベートメソッドを定義することです。
Java 9以降、プライベートプライベートメソッドとプライベート静的メソッドをインターフェイスインターフェイスに追加できます。これらのプライベートメソッドは、インターフェイス内のコードの再利用性を向上させます。たとえば、コードを共有するために2つのデフォルトメソッドが必要な場合、プライベートインターフェイスメソッドはコードの共有を許可しますが、プライベートメソッドをその実装クラス呼び出しに公開しません(後で例を示します)。
インターフェイスでプライベートメソッドを使用するための4つのルールがあります。
- プライベートインターフェイスメソッドを抽象抽象メソッドにすることはできません。抽象抽象メソッドは、インターフェイス実装クラスを実装するために使用されるパブリックメソッドであるため、プライベートにすることはできません。
- インターフェイス内のプライベートメソッドは、インターフェイス内のメソッドからのみ呼び出すことができます。
- インターフェイスのプライベート静的メソッドは、他の静的および非静的インターフェイスメソッドで使用できます。
- インターフェイスのプライベート非静的メソッドは、プライベート静的メソッド内では使用できません。
interface CustomInterface {
public abstract void abstractMethod(); //抽象方法不能是私有的
public default void defaultMethod() {
privateMethod(); //可以调用接口中的私有方法
privateStaticMethod(); //可以调用接口中的私有静态方法
System.out.println("普通方法被调用");
}
public static void staticMethod() {
privateStaticMethod(); //public静态方法可以调用private静态方法
System.out.println("静态方法被调用");
}
private void privateMethod() {
System.out.println("private私有方法被调用");
}
private static void privateStaticMethod() {
System.out.println("private私有静态方法被调用");
}
}
上記の4つのルールによれば、上記のコード定義は正しいです。
2.例:奇数と偶数の合計を別々に計算します
インターフェースは次のように定義されています。以下では、addメソッドはjava8のStream操作を使用し、フィルター条件としてラムダ式を使用し、合計します。コアは次のとおりです。addEvenNumbers偶数合計関数とaddOddNumbers奇数合計関数。どちらもaddインターフェイスのプライベートメソッドを呼び出します。
public interface CustomCalculator
{
default int addEvenNumbers(int... nums) { //非抽象,java8 开始可以定义default方法
return add(n -> n % 2 == 0, nums); //过滤偶数并求和,调用private私有方法
}
default int addOddNumbers(int... nums) { //非抽象,java8 开始可以定义default方法
return add(n -> n % 2 != 0, nums); //过滤奇数并求和,调用private私有方法
}
//按照过滤条件过滤奇数或偶数并sum求和:java9开始可以定义private私有方法
private int add(IntPredicate predicate, int... nums) {
return IntStream.of(nums) //java8 Stream流
.filter(predicate) //java8 predicate及过滤器
.sum(); //sum求和
}
}
インターフェイス実装クラスMainCalculatorは、CustomCalculatorインターフェイスを実装します
public class MainCalculator implements CustomCalculator {
public static void main(String[] args) {
CustomCalculator demo = new MainCalculator ();
int sumOfEvens = demo.addEvenNumbers(1,2,3,4,5,6,7,8,9);
System.out.println(sumOfEvens); //过滤所有偶数并求和,结果是20
int sumOfOdds = demo.addOddNumbers(1,2,3,4,5,6,7,8,9);
System.out.println(sumOfOdds); //过滤所有奇数并求和,结果是25
}
}
私のブログをフォローすることを歓迎します、多くのブティックコレクションがあります
- この記事は、出典を示して複製されています(接続を添付する必要があり、テキストのみを複製することはできません):レターブラザーのブログ。
あなたがそれがあなたに役立つと思うなら、私のためにそれを好きにして共有してください!あなたのサポートは私の尽きることのない創造的な動機です!。また、最近、以下のような高品質なコンテンツを出力しておりますので、よろしくお願いいたします。