1

たとえば、私はこれをよく見ます:

Set<Integer> s = new TreeSet<Integer>();
Set<Integer> s = new HashSet<Integer>();
Map<Integer, String> m = new HashMap<Integer, String>();

以上

TreeSet<Integer> ts = new TreeSet<Integer>();
HashSet<Integer> hs = new HashSet<Integer>();
HashMap<Integer, String> hm = new HashMap<Integer, String>();

前者と後者の長所/短所は何ですか?

4

4 に答える 4

2

私にとって、それはいくつかのポイントに帰着します。

実装に関心がありますか?あなたのコードは、がまたはであることを知る必要がありMapますHashMapTreeMap?それとも、ある種のキー/値構造を持っていることだけを気にしますか?

また、実装コードを作成するときに、Mapを返すメソッドを公開すると、それに依存するコードに影響を与えることなく、時間の経過とともに実装を変更できることも意味します(したがって、キャストを試みるのは悪い考えです。これらのタイプの値)

もう1つは、これらの構造体をコード内で移動するのが簡単になることです。そのため、を受け入れることができるメソッドは、たとえばMapに依存するメソッドよりも扱いやすくなります。HashMap

(私が従う)規則は、基本的に、APIのニーズを満たす最も機能の低いインターフェースを使用することです。APIに必要な機能を提供しないインターフェースを使用しても意味がありません(たとえば、が必要な場合はSortedMap、thenを使用しても意味がありませんMap

私見では

于 2012-08-11T03:18:43.753 に答える
1

一般に、実際に使用している動作を持つ最も一般的な型を宣言する必要があります。そうすれば、別の具象クラスを取ることにした場合でも、それほど多くのコードを変更する必要はありません。そして、関数のユーザーにもっと自由を与えます。

于 2012-08-11T03:19:55.750 に答える
1

ウィリアム R. クックによる再考されたデータの抽象化についての理解と、「オブジェクト」と「オブジェクト指向」の単純化された最新の定義に関する彼の提案を読む必要があります。

基本的に: Java クラスをファクトリ以外のものとして使用する場合、つまり、new演算子の後にクラス名がある場合は、オブジェクト指向プログラミングを行っていません。この規則に従うことは、OO を行っていることを保証するものではありませんが、この規則に違反することは、OO を行っていないことを意味します。

注: OO を実行しなくても問題はありません。

于 2012-08-11T04:45:58.527 に答える
0

アプリケーションのメンテナンスには、開発の 3 倍の費用がかかる場合があります。これは、コードをできるだけ単純かつ明確にする必要があることを意味します。

ArrayList の代わりに List を使用する場合は、ArrayList に特別なメソッドを使用していないこと、および別の List 実装から変更できることを明確にします。ArrayList を使用する必要がない場合に ArrayList を使用する場合の問題は、本当に List であった可能性があることを安全に判断するのに長い時間がかかることです。つまり、何かを必要としていないことを証明するのは非常に困難です。(何かを削除するよりも、何かを追加する方が比較的簡単です)

同様の例は、List が行うときに Vector を使用することです。ベクターが表示されたら、次のように言います。開発者は正当な理由で Vector を選択しました。これはスレッド セーフです。しかし、今すぐ変更して、コードがスレッドセーフであることを確認する必要があります。彼らはあなたが言うが、マルチスレッドの方法でそれがどのように使用されるかを見ることができないので、それが使用される可能性のあるすべての方法を確認する必要があるか、実際には必要ないのに反復するときに同期を追加する必要がありますか?スレッドセーフであること。必要のないスレッド セーフ コレクションを使用することは、CPU 時間の無駄というだけでなく、開発者の時間の無駄にもなります。

于 2012-08-11T06:52:47.830 に答える