7

重複の可能性:
「インターフェイスにプログラムする」とはどういう意味ですか?

オブジェクトを実装するインターフェイスの 1 つとして宣言することを好む人がいることに気付きました。変数のスコープ内では、それをインターフェイスと見なす必要はありません。たとえば、インターフェイスを必要とする外部 API はありません。

例えば:

Map<String, Object> someMap = new HashMap<String, Object>();

または、あなたはただすることができます

HashMap<String, Object> someMap = new HashMap<String, Object>();

インポートjava.util.Mapを完全に避けます。

クラス自体(上記の2番目)とは対照的に、インターフェース(上記の最初)を介して宣言する利点は何ですか?

ありがとう

4

5 に答える 5

3

のようなインターフェースは、オブジェクトができることMap<A, B>宣言します。一方、などのクラスは、オブジェクトがインターフェイスで宣言されていることをどのように行うかを定義します。HashMap<A, B>

変数 (またはフィールドなど) を宣言する場合Map<A, B>、コードはそのインターフェイスによって定義されたコントラクトのみに依存し、実装の詳細には依存しないことを示しています。

と宣言した場合、(何らかの理由で)特定のバージョンのマップが必要でHashMap<A, B>あり、他のものに置き換えることはできないことを理解する必要があります。

私は「実装を変更できるから」などのよくある答えを嫌いがちです。なぜなら、何年も何年も練習を重ねると、それほど頻繁には起こらないことがわかり、主な利点は実際にはこれほど微妙だからです (しかし、明確な)あなたの意図の表現。

于 2012-10-09T18:00:05.733 に答える
3

API の一部ではないため、実装の詳細です。実装では具体的である方が良いです。ここで抽象的である必要はありません。

私の前の答え

Javaの変数定義にインターフェイスまたはタイプを使用しますか?

于 2012-10-09T18:02:48.520 に答える
1

変数が後で使用されない場合、利点/欠点はありません。オブジェクトではなくインターフェイスを使用する理由は、柔軟性を高めるためですが、その変数を使用しなければ、パフォーマンスの観点から違いはありません。

于 2012-10-09T18:01:41.097 に答える
1

を使用するMap<String, Object> someMapと、実装ではなくインターフェイスに設計されます。したがって、他の実装を簡単に切り替えることができます。

したがって、、、または のサブクラスであるその他のオブジェクトをMap指すことができます。HashMapLinkedHashMapMap

あなたが持っている場合: -

Map<String, Integer> someMap = new HashMap<>();

後で実装を変更して (必要に応じて) を指すようにすることができますLinkedHashMap: -

someMap = new LinkedHashMap<>();

一方、LHS で使用する場合は、タイプ..HashMapのオブジェクトのみを指すようにすることができます。HashMap

しかし、それ自体ではパフォーマンスに違いはありdesignませinterfaceimplementation..

于 2012-10-09T18:02:04.060 に答える
1

インターフェイスは、クラスがどのメソッドを実装する必要があるかを定義します。このように、インターフェイスによって定義されたメソッドを呼び出したい場合、オブジェクトの正確なクラス タイプを知る必要はなく、特定のインターフェイスを実装していることだけを知る必要があります。

例:

interface Printer {
    public void print(String text);
}

class FilePrinter implements Printer {
    public void print(String text) {
       //append the text to a file
    }
}

class ScreenPrinter implements Printer {
    public void print(String text) {
       //write the text on the screen
    }
}

class SomeClass {
    public printSomething(Printer myPrinter) {
        myPrinter.print("Hello");
    }
}

SomeClass.printSomething(...) を呼び出す場合、FilePrinter または ScreenPrinter のインスタンスを渡すかどうかは問題ではありません。メソッドは気にしないからです。オブジェクトがインターフェイス Printer を実装し、そのメソッドも実装していることを認識しています。

インターフェイスに関するもう 1 つの重要な点は、クラスが複数のインターフェイスを実装できることです。

于 2012-10-09T18:02:53.953 に答える