public
アクセス修飾子を使用して、または使用せずに、Java インターフェイスのメソッドを宣言する必要がありますか?
もちろん、技術的には問題ありません。interface
is alwaysを実装するクラスメソッドpublic
。しかし、より良いコンベンションは何ですか?
Java 自体はこれに一貫性がありません。たとえば、 Collection
vs. Comparable
、またはFuture
vs.を参照してくださいScriptEngine
。
public
アクセス修飾子を使用して、または使用せずに、Java インターフェイスのメソッドを宣言する必要がありますか?
もちろん、技術的には問題ありません。interface
is alwaysを実装するクラスメソッドpublic
。しかし、より良いコンベンションは何ですか?
Java 自体はこれに一貫性がありません。たとえば、 Collection
vs. Comparable
、またはFuture
vs.を参照してくださいScriptEngine
。
JLSはこれを明確にしています。
public
インターフェイスで宣言されたメソッドのand/orabstract
修飾子を重複して指定することは許可されていますが、スタイルの問題としてお勧めできません。
public 修飾子は、Java インターフェースでは省略されるべきです (私の意見では)。
余分な情報を追加しないため、重要なことから注意をそらすだけです。
ほとんどのスタイル ガイドでは、これを省略することを推奨していますが、もちろん、最も重要なことは、コードベース全体、特に各インターフェイスで一貫性を保つことです。次の例は、Java に 100% 流暢ではない人を簡単に混乱させる可能性があります。
public interface Foo{
public void MakeFoo();
void PerformBar();
}
public
特に構文の強調表示により、コードが読みやすくなるため、修飾子を使用して宣言メソッドを使用しました。ただし、最新のプロジェクトでは、public
インターフェイス メソッドの修飾子のデフォルト構成で警告を表示する Checkstyle を使用したため、省略に切り替えました。
そのため、何が最適かはよくわかりませんが、私が本当に気に入らないことの 1 つは、public abstract
on インターフェイス メソッドを使用することです。Eclipse は、"Extract Interface" でリファクタリングするときに、これを行うことがあります。
デフォルトで適用される修飾子を配置することは避けたいと思います。指摘したように、それは矛盾と混乱につながる可能性があります。
私が見た最悪のものは、メソッドが宣言されたインターフェースabstract
です...
public を持つことは他のオプションがあることを意味するので、そこにあるべきではないという一般的な答えには同意しません。実際のところ、Java 9 以降では他のオプションがあります。
代わりに、Javaは「パブリック」を指定する必要がある/強制する必要があると思います。なんで?修飾子がないということは、他のどこでも「パッケージ」アクセスを意味し、これを特別なケースとして持つことが混乱を招くからです。明確なメッセージ (たとえば、「パッケージ アクセスはインターフェイスでは許可されていません。」) を使用して単純にコンパイル エラーにした場合、'public' を除外するオプションを使用することで導入される明らかなあいまいさを取り除くことができます。
現在の文言に注意してください: https://docs.oracle.com/javase/specs/jls/se9/html/jls-9.html#jls-9.4
「インターフェイスの本体のメソッドは、パブリックまたは プライベートとして宣言できます(§6.6)。アクセス修飾子が指定されていない場合、メソッドは暗黙的にパブリックになります。パブリックを冗長に指定することは許可されていますが、スタイルの問題として推奨されません。インターフェイスのメソッド宣言の修飾子。」
「プライベート」が許可されていることを確認してください。最後の文は JLS から削除されるべきだったと思います。「暗黙的にパブリック」な動作が許可されていたのは残念なことです。これは、下位互換性のために残される可能性が高く、アクセス修飾子がないことがインターフェイスでは「パブリック」を意味し、他の場所では「パッケージ」を意味するという混乱を招く可能性があるためです。
インターフェイスがなく、直接実装を作成していた場合に使用するものを常に記述します。つまり、 を使用しますpublic
。
私はそれをスキップすることを好みます。インターフェースがデフォルトであるpublic
とどこかで読みabstract
ました.
驚いたことに、本 - Head First Design Patternsは、インターフェイス宣言とインターフェイス メソッドを使用public
しています... もう一度考え直して、この投稿にたどり着きました。
とにかく、冗長な情報は無視すべきだと思います。
インターフェースのメソッドがデフォルトで public および abstract である理由は、私には非常に論理的で明白に思えます。
インターフェイス内のメソッドは、実装クラスに実装を強制的に提供するようにデフォルトで抽象化されており、デフォルトでパブリックであるため、実装クラスはそうするためにアクセスできます。
これらの修飾子をコードに追加することは冗長で役に立たず、Java の基礎に関する知識や理解が不足しているという結論につながるだけです。
それは完全に主観的です。冗長なpublic
修飾子は、ごちゃごちゃしているように見えるので省略します。他の人が述べたように、一貫性がこの決定の鍵です。
C# 言語の設計者がこれを強制することにしたことは興味深いことです。 C# でインターフェイス メソッドを public として宣言すると、実際にはコンパイル エラーになります。 ただし、言語間での一貫性はおそらく重要ではないため、Java とは直接関係がないと思います。
人々は、ソースを読むことからではなく、IDE または Javadoc でのコード補完からインターフェイスを学習します。したがって、ソースに「公開」を入れても意味がありません。誰もソースを読んでいません。