なぜJavaインターフェイスメソッドを抽象として宣言するのでしょうか。


143

今日のEclipseの「プルインターフェース」リファクタリング機能を使用して、既存のクラスに基づくインターフェースを作成しました。新しいインターフェイスのすべての新しいメソッドを「抽象」メソッドとして作成するためのダイアログボックス。

そのメリットは何でしょうか?

インターフェイスメソッドを抽象として宣言することが許可されているという事実は、特に推奨されていない、言語の余分で無害な機能であると思いました。

Eclipseがそのようなスタイルをサポートするのはなぜですか、または誰かが自発的にサポートすることを選択するのはなぜですか?

明確化:インターフェースメソッドが抽象的である理由を尋ねているのではありません。それらがインターフェイスにある場合でもそれらはとにかく抽象的であるため、なぜそれらを明示的に抽象としてマークすることを選択するのかと私は尋ねています。

回答:


146

Java言語仕様によると、abstractインターフェースのキーワードは廃止されており、使用することはできません。(セクション9.1.1.1)

とは言っても、Javaには後方互換性があるので、abstractキーワードが存在するかどうかで違いが出るとは思えません。


1
それが私の理解でした(ただし、特定のJLSセクションに精通していませんでした)。私はなぜEclipseが時代遅れのマーキングを作成するオプションを提供するのか疑問に思っています...
Uri

わかった。誰かがどこかでそれを望ましい「機能」であると判断し、それを
実装

18
これは最高評価の回答ですが、仕様の間違ったセクションを参照しています。9.1.1.1はabstract、そのメンバーではなく、インターフェース自体の宣言に関するキーワードを説明しています。以下の@Willの回答は正解であり、有効なリンクソースも含まれています。
シャギーカエル

39

「その恩恵」(インターフェースメソッド宣言に抽象を追加)は、jdk1.3のjdt eclipseコンパイラとの古い互換性の問題です

1.4以降、jdkライブラリには(インターフェースを実装する抽象クラスの)デフォルトの抽象メソッドが含まれなくなりました。
それらの実装はそれらの存在に依存しているため、これはEclipse 1.3コンパイラーの診断をだますことです。
Javac 1.3は1.4ライブラリに対して実行することを完全に拒否することに注意してください(-bootclasspathオプションを使用)。

Eclipseコンパイラーは1.4準拠レベルにある可能性が高いため(を参照Workbench>Preferences>Java>Compiler>JDK Compliance)、1.3準拠モードを使用している場合は少なくとも1.3クラスライブラリを使用するため、現在のほとんどのEclipseプロジェクトでは「抽象」の存在は必要ありません。


3
良い発見。したがって、Eclipseコンパイラーにもはや存在しない問題を回避するのは機能です。
jdmichal 2009年

1
@jdmichal:まさに、ウリの質問に対するより正確な答えでもあります。
VonC 2009年

39

以下からのJava SE 7 JLS(Java言語仕様):「それは許可されているが、冗長インタフェースで宣言されたメソッドの公開および/またはabstract修飾子を指定するには、スタイルの問題として落胆しました。」

以下のためのJava SE 5.0:「Javaプラットフォームの旧バージョンとの互換性のために、それが許可されているが、冗長インターフェースで宣言されているメソッドの抽象修飾子を指定するには、スタイルの問題として、落胆しました。」


9

JLSによると、インターフェースのメソッドはデフォルトで抽象的であるため、キーワードは冗長です。これを知って、私は「プレゼンテーションの混乱を避ける」ためにそれを使うことは決してありません。


これが正解です。更新されたリンクは次のとおりです。「注」セクションを参照してください
mork

JLSは、キーワードがインターフェースのメソッドに対して廃止されたとは言いません。「インターフェースで宣言されたメソッドのパブリック修飾子や抽象修飾子を重複して指定することは許可されていますが、スタイルの問題としてお勧めできません。」JLS#9.4
ローン侯爵

@EJP私はJLSがキーワードが時代遅れになるだろうと述べたとは言いませんでした、これは私の個人的な意見でした;)ところで彼らはこのキーワードが「冗長」であることに気づきました。 。これを明確にするために、回答を編集します。
ダニエルヒラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.