2017-03-09 2 views
1

メソッドfooLinkedHashMapを返すようにしたいと考えてください(データは挿入順に並べ替えられます)。その理由は、このMapにはデータベースが設定され、クエリから返される順序を反映させるためです。メソッドのシグネチャを定義する正しい方法は何でしょうか?LinkedHashMapを返すメソッドのシグネチャ<K,V>

  1. public LinkedHashMap<String, String> foo()
  2. public Map<String, String> foo()

最初は、第二は、より一般的になりつつ、マップは、注文されていることをクライアントに広告の利点を持っているでしょう。確かに

+1

理想的には、OrderedMapインターフェイス、ala SortedMapがあり、それを返すことができます。問題は、この方法のクライアントはこれを知る必要があるということですか?またはそれはちょうど反復して、アイテムがちょうど注文されたことをうわべますか? – MeBigFatGuy

+1

この場合、注文が何であるかを記録する方が良いかもしれません。 LinkedHashMapはアクセスオーダーを持っているかもしれません。あるいは、呼び出し側がそれを文書化することをより良く期待しないような方法で注文されるかもしれません。 –

答えて

1

秒1 - あなたはMapの別の実装を使用するために、将来的に決定する場合は、

はまた気づくこのコードを使用して別の方法では何も変更する必要はありません - あなたは、インターフェイスを好むと実装を非表示にします戻り値の型でメソッドをオーバーロードすることはできませんので、一般的な型を使用すると適切と思われます。

+0

しかし、この場合、クライアントが実装を知っていること、つまりMapが注文されていることは良いことではないでしょうか? – Roland

+1

クライアントがマップの型を知っていて、 'instanceof'を使用して終了する場合は、ここに問題はないはずです;) –

+0

このマップにはデータベースが設定されているため、クエリから返されます。 – Roland

1

このメソッドをどのように使用するかによって異なります。しかし、私は2番目のアプローチをお勧めします。

ソートされた値(つまりTreeMap)または未ソート/順序付けされていない値(HashMap)を返すには、このメソッドをオーバーライドする必要があるとします。この場合、この方法はoverrideにできませんので、別の方法を作成する必要があります。

+1

' map = new LinkedHashMap <>();'を実行することはできますが、それでも広告掲載オーダーは維持されます –

関連する問題