18

これは本当の初心者の質問です(私はまだJavaの基本を学んでいます)。

メソッドがArrayList<String>ではなくList<String>を返す理由、またはArrayListではなくListパラメーターを受け入れる理由を(ある程度)理解できます。メソッドに違いがない場合(つまり、ArrayListの特別なメソッドが必要ない場合)、メソッドはより柔軟になり、呼び出し元にとって使いやすくなります。SetやMapなどの他のコレクションタイプにも同じことが言えます。

私が理解していないこと:次のようなローカル変数を作成するのが一般的な方法のようです。

List<String> list = new ArrayList<String>();

このフォームの頻度は低くなりますが、次のようになります。

ArrayList<String> list = new ArrayList<String>();

ここでの利点は何ですか?

私が見ることができるのは、マイナーな欠点だけです。java.util.Listの個別の「インポート」行を追加する必要があります。技術的には、「import java.util。*」を使用できますが、「import」行が一部のIDEによって自動的に追加されるためか、あまり頻繁には表示されません。

4

7 に答える 7

21

あなたが読むとき

List<String> list = new ArrayList<String>();

気になるのはaであるという考えが得られList<String>、実際の実装にはあまり重点を置きません。List<String>また、特定の実装ではなく、によって宣言されたメンバーに制限します。のように見える限り、データが線形配列に格納されているか、派手なデータ構造に格納されているかは関係ありませんList<String>

一方、2行目を読むと、コードが変数がであることにArrayList<String>を配っていることがわかります。これを書くことで、コードの残りの部分は実際にはであるという事実に依存ArrayList<String>しているため、実際のオブジェクトタイプをやみくもに変更してはならないことを(将来の読者に)暗黙のうちに言っています。

于 2009-09-27T20:57:07.257 に答える
7

インターフェイスを使用すると、List/Map/Set などの基本的な実装をすばやく変更できます。

キーストロークを節約することではなく、実装をすばやく変更することです。理想的には、実装の基礎となる特定のメソッドを公開せず、必要なインターフェイスのみを使用するべきです。

于 2009-09-27T21:00:13.290 に答える
2

これについては、反対側から考えることをお勧めします。通常、リストまたはセットまたはその他のコレクション型が必要ですが、コードでこれがどのように実装されているかは実際には気にしません。したがって、コードは List で機能し、必要なことは何でも実行します (「常にインターフェースへのコード」とも呼ばれます)。

リストを作成するときは、実際に必要な実装を決定する必要があります。ほとんどの場合、ArrayList は「十分」ですが、コードは気にしません。インターフェイスの使用に固執することで、これを将来の読者に伝えることができます。

たとえば、システム プロパティを System.out にダンプするメイン メソッドにデバッグ コードを配置する習慣があります。通常は、システム プロパティをソートする方がはるかに優れています。最も簡単な方法は、単純に「Map map = new TreeMap(properties);」にすることです。そして、TreeMap がソートされたキーを返すので、それらを繰り返し処理します。

Java についてさらに学ぶと、特定のインターフェイスに準拠する実行時に指定された動作を持つオブジェクトを作成できるため、インターフェイスがテストとモックに非常に役立つこともわかります。高度な (しかし単純な) 例は、 http://www.exampledepot.com/egs/java.lang.reflect/ProxyClass.htmlで見ることができます。

于 2009-09-27T21:52:03.540 に答える
1

後でリストの実装を変更して、たとえばLinkedListを使用する場合(おそらくパフォーマンスを向上させるため)、コード全体(およびライブラリの場合はAPI)を変更する必要はありません。順序が重要でない場合は、コレクションを返す必要があるため、アイテムを並べ替える必要がある場合は、後で簡単にセットに変更できます。

于 2009-09-27T20:54:07.413 に答える
1

私が思いつくことができる最も良い説明は(私は他の言語ほど頻繁にJavaでプログラミングしないので)、他のすべてと同じコード/インターフェースを維持しながら「バックエンド」リストタイプを変更するのが簡単になるということですに依存しています。最初にそれをより具体的な型として宣言し、後で別の種類が必要であると判断した場合... ArrayList固有のメソッドを使用することが起こった場合、それは余分な作業です。

もちろん、実際にArrayList固有の動作が必要な場合は、代わりに特定の変数タイプを使用します。

于 2009-09-27T20:54:34.870 に答える
-2

基本的に、これは大規模なプロジェクトを実行しなければならない人々から来ていますが、おそらく他の理由もあります - あなたはいつもそれを聞いています. なぜ、私は実際には知りません。配列リスト、ハッシュマップ、ハッシュセットなどが必要な場合は、インターフェイスにキャストしてメソッドを削除しても意味がありません。

たとえば、最近、基本的なデータ構造として HashSet を使用および実装する方法を学びました。何らかの理由で、私がチームで働きに行ったとします。その人は、データが何らかの基準で順序付けられているのではなく、ハッシング アプローチに基づいていることを知る必要があるのではないでしょうか? Twisol が指摘したバックエンド アプローチは、ヘッダーを公開してライブラリを販売できる C/C++ で機能するため、Java でそれを行う方法を知っている人は、JNI を使用すると想像できます。ヘッダーを公開し、その目的のために確立されたツールを使用してライブラリを構築できる C/C++ を使用します。

jarファイルをextensionsディレクトリにインストールできる人を見つけることができる頃には、エンティティはほんの少しの距離にあるように思えます.extensionsディレクトリにいくつかの暗号化ライブラリをドロップしました。これは便利でしたが、本当に明確で簡潔な根拠が解明されていることを確認します。彼らはいつもそうしていると思います。

この時点で、古典的な難読化のように思えますが、注意してください。問題が発生する前に、コーディングを行う必要があります。

于 2009-09-27T23:32:14.450 に答える