私はJavaと学習インターフェースに不慣れです。期待値を標準化する以外のインターフェースの使い方がわかりませんでした。
他に用途がある場合は、それを理解するのを手伝ってください。
インターフェイスにはいくつかの良い用途があります。
ポリモーフィズム
それらを使用すると、いくつかの異なるが類似したオブジェクトを同じ方法で処理できます。例えば:
public interface Flyer {
public void fly();
}
public class Bird implements Flyer {
@Override
public void fly() {
System.out.println("I'm flying");
}
}
public class Airplane implements Flyer {
@Override
public void fly() {
System.out.println("I'm inanimate and flying");
}
}
// then you can have a method like so:
public void makeFly(Flyer flyer) {
flyer.fly();
}
// or make a list like so:
List<Flyer> fliers = Arrays.asList(new Airplane(), new Bird());
また、オブジェクトをいくつかの異なるボックスに収めることができます。たとえば、はBird
飛ぶだけでなく、Animal
です。Bird
インターフェイスを使用すると、次のいずれかとして扱うことができます。
public interface Animal {
public void move();
}
public class Bird implements Flyer, Animal {
@Override
public void fly() {
System.out.println("I'm flying");
}
@Override
public void move() {
fly();
}
}
// now I can do:
Bird bird = new Bird();
Flyer flyer = new Bird();
Animal animal = new Bird();
分離設計
さらに、実装を柔軟に選択できます。(「期待値の標準化」の意味はわかりませんが、この使用法はおそらく標準化に最も関連しています。つまり、これは標準を作成するために機能します。)たとえば、を返すメソッドがあるとしますList<Flyer>
。List
はインターフェースなので、実装としてuse ArrayList
、などを選択できます。LinkedList
public List<Flyer> makeFlyerList() {
return new ArrayList<Flyer>(Arrays.asList(new Airplane(), new Bird()));
}
// works just the same
public List<Flyer> makeFlyerList() {
return new LinkedList<Flyer>(Arrays.asList(new Airplane(), new Bird()));
}
インターフェイスは、実行するクラスを実装するためのコントラクトを宣言する方法です。これは、消費者と生産者の間で抽象化と分離されたデザインを作成するための主要なツールです。
私の頭に浮かぶもう1つのケースは、マーカー機能です。
java.lang.Cloneable
たとえば、メソッド宣言はありません。これは、クローン可能なクラスとして実装するクラスにフラグを立てるためにのみ使用されます。
ドキュメントから:
クラスはCloneableインターフェースを実装して、Object.clone()メソッドに、そのメソッドがそのクラスのインスタンスのフィールドごとのコピーを作成することが合法であることを示します。
同じ使用法の別のサンプルは、 Serializableで見ることができます
Javaには、継承(つまり多重継承)の設計による制限があります。したがって、複数のクラスを拡張することはできませんが、必要な数のインターフェースを実装できます。
Javaでインターフェースを使用することの2番目の利点は、アプリケーションの設計とパフォーマンスに関連しています。どのようなアプリケーションでも、「緩く結合」され、「高度にコヒーレント」である必要があります。ここでインターフェースが登場します。インターフェイスはクラス間のコントラクトを実装するため、設計は緩く結合されます。
これがお役に立てば幸いです。
はい、でも私は「ただ」という言葉に反対します。
抽象メソッドだけでなく、に付属するその他のあらゆる種類の手荷物を定義できることを忘れないでくださいexpectation
。
たとえば、MapインターフェイスにはMap.Entry内部インターフェイスがあることに注意してください。ここでは、マップに期待できることだけでなく、マップなどMap
に期待できるいくつかのことについて詳細を確認しEntries
ます。
Java APIには多くの例はありませんが、実際のプログラミングでは、インターフェイスクラスにも多数のenum
sやが含まれる場合が多くあります。public static final
これらは、このタイプのオブジェクトに対して実行できることと実行できないことを、ほぼ過度のレベルまで洗練および詳細化するために使用されます。
要約すると、あなたは正しいです...ある程度...interface
は単に期待を標準化するだけですが、少しの研究は、期待を標準化することはいくつかの信じられないほど複雑なものに値する広くて深い主題であることを示しますinterface
。