2012-02-22 16 views
0

私はインターフェイスにコードを実装する理由を設計方法論に疑問を持っています。これはプリミティブデータ型で非常によく見られます。特にプリミティブなデータ型の場合、コーディングを「インタフェースに」する必要があるのはなぜですか?

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

そして

HashMap<Integer, String> mymap = new HashMap<Integer, String>(); 

これら二つの間のいずれかの違いがあります:ような私は、これら二つの間の差を得ていないのですか?私たちが使用しようとしているそれぞれの場所は、どちらの場合も同じままであることを意味します。mymap

ご質問が役に立たないと思われる場合は申し訳ありませんが、後でmymapが使用される方法については、これがどのように異なるのかについて実際には分かりません。助けてください?

おかげ..

注 - 私はすでにSO上this質問を見てきましたが、私が欲しいものを与えていません。

+1

あなたが望むものを提供していない他の質問について具体的には何ですか? – Russell

+0

質問はあなたがリンクしている非常に良い答えを持っている –

+0

私は私の質問に記載されているようにプリミティブ型のインターフェイスコーディングスタイルについて何も指定されていないので、私は私の答えを得ていない。 – Ved

答えて

1

Mapの実装が異なる別の場所でmymapをインスタンス化することができるので、それを使用するコードで0123,のインスタンスであることに依存するべきではありません。

+0

私はあなたを持っていますが、 'HashMap'のインスタンスに頼らざるを得ないようなケースを詳しく教えてください。 – Ved

+0

たとえば、それがTreeMapとして作成されている場合。 –

+0

ナンセンス;この例では明示的に 'new HashMap'として初期化されています。唯一のことは 'HashMap'特有の機能を隠すことです。そのタイプが外部ソースから来て、それがインタフェースタイプとして返​​されない限り、これを行う理由は何もありません。 – Nyerguds

4

もう1つのオプションは、ある日のTreeMapがより便利な場合でも、常にHashMapを使用するように制限します。

最初のコードでは、特定の実装を簡単に変更できます。コードを1行だけ変更するだけです。これは、メソッドからマップを返すと特に見えます。メソッドの戻り値の型は変更する必要はありません。

インターフェイスにコードを書くことは、テスト中にオブジェクトを模倣するのにも役立ちますが、ここではそうではないと想定しています。

+0

あなたの答えをありがとう.. !! +1を返す型は変更する必要はありません。 – Ved

+0

2番目のオプションは、 'HashMap'_の特定の機能をすべて削除します。 'HashMap'型から追加の関数を利用できるようにするには、型を不必要に制限するべきではありません。古い "あなたは後でそれを取り替えることができます"という議論は愚かです。これは、地図の必要な機能の初期評価がうまく行かなかったことを意味します。それ以外の理由で戻り値の型を制限することは、呼び出しレベルで利用可能な機能を不必要に隠すだけです。 – Nyerguds

+0

@ニーアードー必要なときに機能を公開することについて誰も主張していません。ここでのポイントは、柔軟性を後で与えるために*必要なだけ*を公開しようとすることです。 'HashMap'が必要な場合は' HashMap'を使いますが、必要なのは 'Map'だけです。実装タイプが' HashMap'であってもそれを使用してください。 – soulcheck

0

Map mymapを使用すると、後で実装を変更することができます。たとえば、ある時点でmymapを注文する必要がある場合は、初期化をLinkedHashMapに変更するだけです。

0

自分のタイプ(プライベート)でのみこれを使用し、自分でインスタンス化すると、実際の違いはありません。

あなたのタイプのパブリックインターフェイスがMap対HashMapを公開しているのは面白いです。

+0

後でプライベートメソッドで、TreeMapをより優れたコレクションにすると決定した場合でも、プライベートメソッドでもあなたを保護します。 – Rich

+0

IMHOこの利点は実用的より理論的です。ほとんどの場合、データ型を指定するフィールド/変数宣言を変更するだけです。私の経験によると、インターフェースには、既存の機能やキャストの再実装をもたらす具体的なタイプが提供するメソッドがないことがよくあります。それにもかかわらず、プライベートメンバーのための変数のフィールドの "正しい"データ型について考えることは良い習慣です。 – Matthias

+0

@winSharp Mapはかなり完成しました。 'putIfAbsent'以外にも、問題なく 'ConcurrentHashMap'と言うことができます。 – Voo

0

具体的な例では、違いはありませんが、の柔軟性が必要な正当なインスタンスがあるため、宣言で常にインターフェイスを使用することをお勧めします。あなたのコードの残りすべてを壊すことなく、例えば

Map<Integer, String> mymap = new TreeMap<Integer, String>(); 

+0

'HashMap'オブジェクトや' ArrayList'オブジェクトで利用できる特定の関数を意図的に使用しないことをお勧めします。それはあなたが主張していることですか? – Nyerguds

0

前者は、あなたが変更することができます。

さらに小さな利点は、IDEが実装のための(潜在的にはるかに多くの)メソッドではなく、インターフェイスのメソッドを表示できることです。

関連する問題