web-dev-qa-db-ja.com

インターフェイスを抽象として宣言する理由

インターフェイスを抽象として宣言するポイントは何ですか?インターフェイスメソッドについても同じです。それにポイントはありますか?

例えば。

public abstract interface Presenter {
 public abstract void go(final HasWidgets container);
}
49
Sudhir Jonathan

投稿したコードの塊、古いJavaコードベースはどこで見つけましたか?
これは [〜#〜] jls [〜#〜] が言うべきことです:

9.1.1.1抽象インターフェース:
すべてのインターフェースは暗黙的に抽象的です。この修飾子は廃止されたため、新しいプログラムで使用しないでください。

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

66
sateesh

インターフェイスとインターフェイスメソッドは、宣言されていなくても暗黙的にabstractです。したがって、明示的に指定する必要はありません。

28
notnoop

違いはありません-インターフェイスとインターフェイスメソッドは常に抽象的ですが、修飾子を追加する必要はありません(また、インターフェイスメソッドは常にパブリックなので、パブリック修飾子も必要ありません)。

[〜#〜] jls [〜#〜] から:

9.1.1.1抽象インターフェース

すべてのインターフェイスは暗黙的に抽象的です。この修飾子は廃止されたため、新しいプログラムで使用しないでください。

4
Andreas_D

通常、インターフェイスまたはそのメソッドを抽象として宣言しません。それらは暗黙的です。

メソッドもパブリックなので、スキップすることもできます。 :-)

2
KLE

この投稿をご覧ください

https://stackoverflow.com/questions/4380796/what-is-public-abstract-interface-in-Java/4381308#4381308

インターフェイスは%100抽象クラスです。

キーワードabstractはここでは冗長です

1
user467871

「インターフェイスを抽象として宣言する理由」-私は同じ質問を受け、抽象は冗長であると考えました。しかし、Java 1.8でMapインターフェースを見たとき、これをJavaで変更する必要があるかもしれません

//  (version 1.8 : 52.0, no super bit)
// Signature: <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;
public abstract interface Java.util.Map {

  // Method descriptor #1 ()I
  public abstract int size();
}
1

インターフェイスメソッドの抽象修飾子は、パブリック修飾子と同様に常に冗長です。

インターフェイスは新しい演算子を使用してインスタンス化することはできず、リフレクションを介して要求された場合、インターフェイスは常に抽象的であるため、インターフェイス自体の抽象修飾子は厳密な技術的理由で冗長になる場合があります。

ただし、インターフェース抽象を宣言する意味論的な理由があります(これはさまざまなUMLツールでもサポートされています)。直接、ただしサブインターフェース経由のみ。例えばインターフェースNode=は抽象的に意味するが、サブインターフェースのFolderとFileはNodeは意味的に抽象ではない。決してインスタンスを持たない。 Node-フォルダーまたはファイルのいずれかになります。

さらに、インターフェイスの「インスタンス化」を可能にするフレームワークがあります(技術的には動的プロキシを介して)。いくつかのインターフェイス(たとえば、定義済みのベースインターフェイス)は、引数として提供することはできません。文書化の目的で、このような情報を表現するために抽象修飾子を使用することはソースコードで意味があります。

0
Jörg

インターフェイスのデフォルトの動作は、例にあるものと本質的に同等です。抽象として定義することは冗長です。

0
Zack Marrapese

インターフェイスが抽象的であると宣言する意味はありません。インターフェースのメソッドは抽象のみです。もう1つ抽象クラスには具象メソッドと抽象メソッドの両方を含めることができますが、インターフェースには抽象メソッドのみが必要です。

0
giri

クラスの構文とセマンティクスとの冗長性、明示性、一貫性だけを考えています...

する必要はありませんが、コードの読者が気が散っているか、Javaにあまり詳しくない場合に役立つかもしれません。

0
fortran