Java抽象インターフェース


197

例を考えてみましょう(Javaでコンパイルされます)

public abstract interface Interface {
    public void interfacing();
    public abstract boolean interfacing(boolean really);
}

インターフェイスを抽象的に「宣言」する必要があるのはなぜですか?抽象インターフェースに適用される他のルールはありますか?


最後に:abstract時代遅れの場合、なぜJavaに含まれているのですか?抽象インターフェースの歴史はありますか?



5
最後に:....」の部分を考慮した重複ではありません。
aioobe 2011

この関連の質問は、実際の例を引用:stackoverflow.com/questions/4380796/...
レドワルド

1
そして、なぜ「インターフェースを抽出」すると、Eclipseはデフォルトで「抽象」を追加するのですか?
ModdyFire 2014

@ModdyFire、詳しく説明してください。
ブハケシンディ2014

回答:


447

インターフェイスを抽象的に「宣言」する必要があるのはなぜですか?

そうではありません。

public abstract interface Interface {
       \___.__/
           |
           '----> Neither this...

    public void interfacing();
    public abstract boolean interfacing(boolean really);
           \___.__/
               |
               '----> nor this, are necessary.
}

インターフェースとそのメソッドは暗黙的でabstractあり、その修飾子を追加しても違いはありません。

抽象インターフェースに適用される他のルールはありますか?

いいえ、同じルールが適用されます。このメソッドは、(具体的な)実装クラスによって実装する必要があります。

抽象が古くなっているのに、なぜJavaに含まれているのですか?抽象インターフェースの歴史はありますか?

興味深い質問です。JLS の最初の版を掘り起こしましたが、そこにも「この修飾子は廃止されており、新しいJavaプログラムでは使用しないでください」と書かれています

さて、さらに掘り下げて ...壊れたリンクを数多く見つけた後、私はなんとかオリジナルのOak 0.2 仕様(または「マニュアル」)のコピーを見つけました。私が言わなければならないかなり興味深い読み、そして合計で38ページだけ!:-)

セクション5の「インターフェース」で、次の例を示します。

public interface Storing {
    void freezeDry(Stream s) = 0;
    void reconstitute(Stream s) = 0;
}

そしてマージンにはそれが言う

将来的には、インターフェイスでのメソッドの宣言の「= 0」部分がなくなる可能性があります。

キーワードに=0置き換えられたと仮定すると、ある時点でabstractそれabstractがインターフェイスメソッドに必須であったと思います!


関連記事:Java:抽象インターフェースと抽象インターフェースメソッド


3
しかし、抽象自体は時代遅れではありませんか?インターフェースには使用されていませんが、抽象クラスとメソッドはまだ残っています。
user85421 2011

ありがとう;-) abstractインターフェイスメソッドの前でも許可できるように、ようやく原点を特定しました。
aioobe 2011

13
ワオ。そのため、「設計上」廃止されました。それらのJLSデザイナーは、本当に何かを壊したり、リリースされなかったものを壊したりすることさえ本当に恐れていました... :-)
Lukas Eder

@aioobe、あなたは私たちが知らないGoogle Webクローラーである必要があります...笑
Buhake Sindi '26

18
ところで 「パブリック」は、インターフェース宣言のメソッドにも必要ありません...それらは常にパブリックです。
録音

37

publicインターフェースメソッドと同様に、これは必須ではなく、オプションです。

これに関するJLSを参照してください。

http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.html

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

そして

9.4抽象メソッド宣言

[...]

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

インターフェースメソッドのパブリック修飾子を重複して指定することは許可されていますが、スタイルの問題としては強くお勧めできません。


7
...それは許されますが、強く推奨、スタイルの問題として、冗長互いに隣と同じ意味と、ほぼ正確な内容を持つ2つの文章を書くことです:JLSへ
n611x007

11

インターフェースの抽象を宣言する必要はありません。

これらすべてのメソッドをpublic(インターフェースがpublicの場合はすでに宣言されている)またはabstract(すでにインターフェースに含まれている)と宣言するのと同じように冗長です。

しかし、誰もあなたを止めません。

あなたが明示的に述べることができるが、する必要のない他のもの:

  • コンストラクタの最初の行でsuper()を呼び出す
  • extends Object
  • 継承されたインターフェースを実装する

抽象インターフェースに適用される他のルールはありますか?

インターフェースはすでに「抽象的」です。そのキーワードを再度適用しても、まったく違いはありません。


2
どうやら、インターフェイス自体がパッケージプライベートの場合、メソッドはパブリックです。
ティロ2011

7

春にそれは非学術的な意味を持っていることに注意してください。抽象インターフェースは、それをに使用しないように開発者に警告するものです@Autowired。春/日食@Autowiredがこの属性を見て、その使用法について警告/失敗するます。

実際の例:@Repositoryに対する@Transnationalの下の@Serviceプロキシは、同じ基本的なメソッドを使用する必要がありますが、により、この抽象インターフェースを拡張する異なるインターフェースを使用する必要があります@Autowired。(これをXXXSpecインターフェースと呼びます)


+1のヒットで、不動態化できないセッションBeanの注入の分離をひどく探しました。多分私はルールにfindbugs / checkstyleを使うことができます...
Grim

3

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

[Java言語仕様-9.1.1.1 abstractインターフェース]

また、インターフェイスメンバーメソッドは暗黙的に使用されることにも注意してくださいpublic abstract
[Java言語仕様-9.2インターフェースメンバー]

なぜこれらの修飾子は暗黙的なのですか?ここで役立つ他の修飾子( ' no modifier ' -modifierも含めない)はないため、明示的に入力する必要はありません。



2

インターフェースのすべてのメソッドは抽象であるため、インターフェースはデフォルトで抽象であるため、これは必要ありません。


-2

少なくとも理論的には、抽象インターフェースは誰もが言っているように冗長ではありません。

インターフェイスは、クラスと同じように拡張できます。アプリケーションのインターフェース階層を設計する場合、「ベース」インターフェースを使用している可能性があります。他のインターフェースを拡張しますが、それ自体はオブジェクトとして必要ありません。

例:

public abstract interface MyBaseInterface {
    public String getName();
}

public interface MyBoat extends MyBaseInterface {
    public String getMastSize();
}

public interface MyDog extends MyBaseInterface {
    public long tinsOfFoodPerDay();
}

クラスにMyBaseInterfaceを実装するのではなく、他の2つのMMyDogとMyBoatだけを実装する必要がありますが、両方のインターフェースがMyBaseInterfaceインターフェースを共有するため、「name」プロパティがあります。

ちょっとアカデミックなことは知っていますが、面白いと思う人もいると思いました。:-)

この場合、実際には単なるマーカーであり、独自に実装するように設計されていないインターフェースの実装者に信号を送ります。コンパイラー(少なくとも、私が試したsun / ora 1.6)が抽象インターフェースを実装するクラスをコンパイルすることを指摘しておきます。


3
あなたは私の質問を完全に誤解していると思います。
Buhake Sindi 2013

3
私はこの推論に同意しません。すべてのインターフェイスは完全に使用可能な機能セットを提供する必要があるため、すべてのインターフェイスを独自に実装できると思います。また、すべてのインターフェースはすでに暗黙的に抽象であるため、コンパイラが明示的に抽象として宣言されたインターフェースを実装するクラスのコンパイルを拒否する理由はありません。それは「抽象」キーワードの意味を完全に変えるでしょう。
BladeCoder 2014年

-3

まあ「抽象インターフェース」は字句の構成要素です:http : //en.wikipedia.org/wiki/Lexical_analysis

コンパイラーで必要ですが、と書くこともできますinterface

言語の語彙構成に深く入りすぎないようにしてください。コンパイルプロセス中の特別なケースと呼ばれるコンパイルのあいまいさを解決するため、または下位互換性のために、コアの語彙構成に焦点を当ててみてください。

`インターフェイスの本質は、実装が異なる可能性があるいくつかの抽象的な概念(アイデア/思考/高次の思考など)を取り込むことです...つまり、複数の実装が存在する可能性があります。

インターフェースは、キャプチャまたは表現しているオブジェクトの機能を表す純粋な抽象データ型です。

特徴は空間または時間で表すことができます。それらがスペース(メモリストレージ)で表される場合、具体的なクラスがフィールドとそのフィールドまたは時間で動作するメソッド/メソッドを実装することを意味します。つまり、機能を実装するタスクは純粋に計算的です(より多くのCPUクロックが必要)。処理のために)機能実装の空間と時間の間のトレードオフがあります。

具象クラスがすべての機能を実装していない場合は、思考、アイデア、または抽象性の実装があるため、再び抽象化されますが、完全ではないため、abstractクラスで指定します。

具象クラスは、クラスXYZをキャプチャしようとしている抽象性を完全にキャプチャするクラス/クラスのセットになります。

したがって、パターンは

Interface--->Abstract class/Abstract classes(depends)-->Concrete class

1
この答えは私の質問にはまったく答えません。また"It seams like you are new to Java。本当に?
ブハケシンディ2014

「abstract is obsolete」
マニッシュ、2014年

(1)「abstract is obsolete」->削除してコンパイラが認識しなくなった場合、「abstract interface」を使用する以前のバージョンのソースコードは新しいバージョンでコンパイルできません。下位互換性を維持する必要があります。抽象インターフェイスを定義すると、インターフェイスキーワードの意味がそれに合わせて「抽象化」されます。これは、はるかにクリーンなバージョンですが、経験豊富なプログラマにとっては、「インターフェイス」というショートカットを提供しています。質問はi = i + 1 ==に似ています。 > i ++ ..選択はあなたが選択したものです:D
Manish

受け入れられた答えを見てください。私abstractはインターフェースが時代遅れであることを知っています。なぜそれがまだ受け入れられるのか、そしてabstractインターフェイスの背後にある歴史は何かを知りたかったのです。抽象とインターフェイスのJava 101ガイドを教えてください。
ブハケシンディ2014

これは字句構造ではありません。構文です。意味的には冗長です。「コンパイラーには必要ありません」。空間/時間に関する部分はただのドライブです。このナンセンスはどれも、尋ねられた質問に答えません。コードではないテキストにコード形式を使用しないでください。
ローン侯爵、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.