web-dev-qa-db-ja.com

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

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

その利点は何でしょうか?

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

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

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

139
Uri

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

とはいえ、後方互換性に対するJavaの傾向により、abstractキーワードが存在するかどうかに違いが生じることは本当にないでしょう。

143
jdmichal

Eclipseの「その利点」(インターフェースメソッド宣言に要約を追加)は、 jdk1.3のEclipseコンパイラjdt1. との古い互換性の問題です。

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プロジェクトでは「抽象」の存在は必要ありません。

38
VonC

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

Java SE 5. : "Javaプラットフォームの古いバージョンとの互換性のために、スタイルの問題として、抽象修飾子を冗長に指定することは許可されていますが、推奨されませんインターフェイスで宣言されたメソッドの場合。」

37
Will

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

9
Daniel Hiller