web-dev-qa-db-ja.com

Javaインターフェースのすべてのメソッド宣言がパブリック抽象であるとは限らないので、これらの修飾子を使用してメソッドを宣言する必要がありますか?

Java 8から始まり、defaultメソッドがインターフェイスに導入されました。つまり、interfaceのすべてのメソッドがabstractであるとは限りません。

Java 9(たぶん)で始まる)では、privateメソッドが許可されます。つまり、interfaceのすべてのメソッドがpublic abstractであるとは限りません。

「Javaインターフェースのメソッドは、publicアクセス修飾子の有無にかかわらず宣言する必要がありますか?」という質問がスタックオーバーフローの https:// stackoverflow。 com/questions/161633/should-methods-in-a-Java-interface-be-declared-with-or-without-a-public-access-m

そこでは、ほとんどの回答で、interfaceのメソッドはpublic abstract以外のものにはなり得ないため、public abstractは使用すべきではないと主張しました。それはもはやそうではありません。

したがって、インターフェースのこれらの新機能を考慮して、public abstractキーワードをJavaインターフェースメソッド宣言で使用する必要がありますか?

私の特定の環境では、Javaコードを時々読んでいますが、Javaの経験はありませんが、public abstractキーワードを省略しているように感じますでは、これらのキーワードを使用するためのインターフェースにさまざまなルールが適用されるようになった経緯に精通していない人のために、さらに混乱する点が生じます。

14
David Campbell

StackOverflowの回答を拡張するには:

  1. publicアクセス修飾子は必要ないため、

    すべてのメソッド宣言インターフェースの本文暗黙的にパブリック(6.6)。インターフェイスのメソッド宣言にpublic修飾子を重複して指定することは許可されていますが、スタイルの問題としてはお勧めできません。 ( 9.4節

  2. abstractアクセス修飾子は必要ないため、

    デフォルトのメソッドは、インターフェイスでデフォルト修飾子;と宣言されているメソッドであり、そのbodyは常にブロックで表されますです。

    そして...

    インターフェースメソッドデフォルト修飾子なしまたは静的修飾子は暗黙的に抽象であるため、その本体はセミコロンで表され、ブロックではありません。

デフォルトのメソッドには本体があり、本質的には抽象メソッドではなく、インターフェースのすべてのメソッド宣言は本質的にパブリックであるので、どちらのキーワードも指定する必要はありません。


回答に対するコメントの1つは次のように述べています:

彼らに考えさせないでください!スタイルポリスにもかかわらず、以前は常にパブリックアブストラクトを追加していました。これにより、物事が明確になり、読者に思い出させました。 Java 8および9は物事を複雑にするので、私は今、私は立証されています(user949300)

StackOverflowの質問へのコメント(賛成18回)は、これに反駁します。

パブリックとして書くことはそれが非パブリックである可能性があることを暗示するので、それは悪いです(Pacerier)

コード、特にインターフェースの影響は重要です。

2
Greg Burghardt

ブロックステートメントの欠如は十分な意味合いを持ちませんか?暗黙のうちにextends Objectを宣言しますか?

開発者が冗長性を理解していない場合、可能性は言語機能の背後にある概念を完全に理解していない可能性がありますこれは、修飾子について混乱するよりもさらに大きな問題です。

開発者は、インターフェイスの目的が、クライアントがオブジェクトと対話する方法を定義するコントラクトを作成することであることを理解する必要があります。これは、インターフェイスのすべてのメソッドオブジェクトの相互作用に使用がクライアントに公開されることを示唆しています。

メソッドをプライベートとして宣言すると、そのメソッドはクライアントから呼び出されることを意図していないことを明示的に示します。これは、インターフェイスの場合、簡単に推測できないものです。

1
Vince Emigh