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


14

Java 8以降、defaultメソッドがインターフェイスに導入されました。事実上、これはのすべてのメソッドがであるとinterfaceは限らないことを意味しますabstract

Java 9(おそらく)以降、privateメソッドは許可されます。これは、のすべてのメソッドがであるとinterfaceは限らないことを意味しますpublic abstract

「Javaインターフェイスのメソッドは、publicアクセス修飾子を付けて、または付けずに宣言する必要がありますか?」という質問 スタックオーバーフローで/programming/161633/should-methods-in-a-java-interface-be-declared-with-or-without-a-public-access-mで尋ねられました

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

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

私の特定の環境では、経験豊富なソフトウェアエンジニアがJavaを経験していない人がいて、Javaコードを時々読んでいます。public abstractキーワードを省略すると、インターフェースがこれらのキーワードを使用するためのさまざまなルールを持つようになった経緯に詳しくない人にとっては、さらなる混乱点が生じると思います。


5
Java 8 JLSをチェックしましたか?SOの古い受け入れ答えと同じセクションでは、デフォルトメソッドの導入は同じ冗長性の考慮に基づいていた以前の勧告を変更しなかった示唆:「欠けているインタフェースのメソッドdefault修飾またはstatic修飾子が暗黙的にされてabstract...それが許可されていますが、スタイルの問題として、abstractこのようなメソッド宣言の修飾子を冗長に指定することは推奨されません。」なぜ物事は変わるはずだと思いますか?
gnat

3
メソッドの条件が暗黙的にabstract複雑になりつつあるため、状況が変わる可能性があると考えました。Java 9では、同じ文は、「default修飾子、static修飾子、またはprivate修飾子が欠けているインターフェースメソッドは暗黙的に抽象的です...」になります。さらに、キーワードを明示的に使用しないための補助引数、つまり、すべてのインターフェースメソッドはpublic abstract、今では意味がありません。
デビッドキャンベル

TBH「デフォルト」メソッドの背後にある理由を理解していません。また、静的メソッドでさえ、インターフェースが通常行うことを意図している範囲を超えています。インターフェースは、コンクリートで覆われているはずではありません。そのため、参照に便利なタイプです。
トリクシーウルフ

1
@TrixieWolfのデフォルトのメソッドにより、インターフェースを進化させることができます。以前は、クラスとは異なり、メソッドを追加するとすべての実装が壊れていました。現在、適切な候補のデフォルトがある限り、インターフェイスを拡張できます。追加を検討 streamするがjava.util.Collection、かMap.getOrDefault()。別の方法は、新しいサブインターフェイスを作成し、Graphics2Dのように全員をダウンキャストさせることです。
スーザンW

回答:


2

StackOverflowの答えを展開するには:

  1. publicアクセス修飾子がいるので必要ありません

    インターフェース本体のメソッド宣言すべて暗黙的にパブリックです(§6.6)。インターフェイスのメソッド宣言にpublic修飾子を冗長に指定することは許可されていますが、スタイルの問題として推奨されていません。(セクション9.4

  2. abstractアクセス修飾子がいるので必要ありません

    デフォルトメソッドは、デフォルト修飾子を使用してインターフェイスで宣言されたメソッドです。その本体は常にブロックで表されます

    そして...

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

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


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

彼らに考えさせないでください!スタイルポリスにもかかわらず、私はいつもパブリックアブストラクトを追加しました。Java 8と9が物事を複雑にしているので、今私は立証されています(user949300)

StackOverflowの質問(18回の投票)へのコメントは、これに反論しています。

パブリックとして書くことは、それが非パブリックになる可能性があることを意味するため、悪いことです(Pacerier)

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


StackOverflowから引用したコメントは古くなっています。public修飾子を追加することは、それが非公開になる可能性があることを暗示しているため、不適切な記述であると言うことは矛盾しています。メソッドは非公開にすることができます。
デビッドキャンベル

@DavidCampbell:そうですね、Java 9が登場した後、この質問の方が良い質問だと思います。:)まだ完成予定のJava仕様は、この質問に答えるかもしれません。
グレッグブルクハート

1

ブロックステートメントの欠如は十分ではありませんか?それがextends Object暗示されているにもかかわらず、あなたは宣言しますか?

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

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

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


2
彼らに考えさせないでください!public abstractスタイルポリスにも関わらず、私はいつも前に付け加えました。Java 8と9が事態を複雑にしているので、今私は立証されています:-)。Javaはすでにかなり冗長です。
user949300

1
@ user949300またextends Object、直接派生するすべてのクラスに追加しObjectますか?開発者がすでに知っているべき情報であるため、推論されます。画面上の無駄な情報が少ないほど、重要な情報を簡単に処理できます。うまくいけば、私はあなたに暗黒面に来るように説得しました(それを手に入れますか?暗黙のものは見えないので)。そうでない場合、それは一撃の価値があった。最終的には、開発者にとってコードの管理を容易にするものになります
ビンスエミー

@ user949300これを行うことにより、インターフェイスメソッドにこれらの宣言が含まれていない場合の意味について混乱が生じる可能性が高くなります。つまり、コードを見てJavaを学習している開発者がいる場合、インターフェイス宣言の構文の理解を妨げている可能性があります。
ジミージェームズ

Vince、いや、Objectを拡張しませんが、それを行うコードを見ても適合しません。@JimmyJames、そうであるアイテムにパブリックアブストラクトを一貫して追加する場合、混乱は見られません。何か不足していますか?大藤、ごちゃごちゃしてるね。例えば、私は追加しないfinal何かがおかしい、それを必要としない限り、(匿名の内部クラスなどのような...)メソッドの引数の前に
user949300

@ user949300彼は、ユーザーが修飾子の欠如とその背後にある理由にすでにさらされている場合、それらが表示されたときに修飾子が存在する理由を疑問視し、単に明示的である以外に実際の理由があると仮定することを意味します。私が見た場合、私はフィットを投げませんでしたextends Objectが、それは間違いなく旗を立てて、なぜ私に質問させます。私はポストに述べたように、そのようなことを行うと、開発者は(すべてのオブジェクトがすでに拡張ことを知らないかもしれませんどのように何かの作品の誤解を有することができることを意味するものでしたObjectため、明示的な拡張)
ヴィンスEmigh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.