人々が使用するライブラリを作成していますが、なぜ私のメソッドはArrayListではなくListを返す必要があるのですか?
ユーザーが実際の型がArrayListであることを知っている場合は、イテレーターの代わりにループでアクセサー[]を使用しますが、知らない場合はイテレーターを使用するためです。
LinkedListについても同じ質問ですが、戻りタイプがリストの場合、正しいアクセサーを使用することはできません。
私は正しいですか?
人々が使用するライブラリを作成していますが、なぜ私のメソッドはArrayListではなくListを返す必要があるのですか?
ユーザーが実際の型がArrayListであることを知っている場合は、イテレーターの代わりにループでアクセサー[]を使用しますが、知らない場合はイテレーターを使用するためです。
LinkedListについても同じ質問ですが、戻りタイプがリストの場合、正しいアクセサーを使用することはできません。
私は正しいですか?
Listを返すと、ライブラリのユーザーはListインターフェイスを実装するものをすべて使用できるようになりますが、 ArrayListを使用すると、強制的にArrayListを使用するようになります。
将来、ライブラリ作成者として内部実装を変更することを決定した場合、その変更は、ライブラリへの汎用インターフェイスによってエンドユーザーから隠されます。
ライブラリのユーザーは、ArrayListを内部で使用していることを決して知らないはずだからです。
たとえば、ArrayListを返し、多くの人がライブラリを使い始めたとします。LinkedListが目的に適していることに突然気付いた場合は、現在コードを使用しているすべての人の互換性が失われます。
これが、実装ではなくインターフェイスにコーディングする方が常に優れている理由です。特に再利用を目的としたコードを作成する場合は、さらにそうです。インターフェイス(この場合はリスト)は、コードとクライアントのコードの間のコントラクトとして機能します。それはあなたのコードが何をするのか(インターフェース)を彼らに伝えますが、それがどのように行われるのか(実装を公開しないことによって)彼らに伝えません。
可能であれば、インターフェースを返します(またはそのスーパークラスに失敗しますか?)。このように、オーバーライドされた場合、メソッドはより幅広いアプリケーションを持つことができます。これにより、返されたオブジェクトで一部のクラス固有のメソッドを使用できなくなる可能性がありますが、プログラマーがList
データを取得して、使用したいものにコピーするのを止めることはできませんCollection
。
List myList = new MyLibrary().getList();
ArrayList myArrayList = new ArrayList(myList);
LinkedList myLinkedList = new LinkedList(myList);
あなたのユーザーはあなたのリストからまたはのどちらかを作ることができるのでArrayList
、LinkedList
あなたは彼に選択を任せます。これは、プログラミングからインターフェイスと呼ばれます。APIのユーザーにできるだけ多くの自由を与える必要があります。この手法は、APIを実現する方法の1つです。
イテレータを使用する必要はありません。リストインターフェイスはget(int index)
メソッドとしてサポートしています。基になるコンテナをリストインターフェイスをサポートするものに柔軟に変更する場合は、を使用しますList
。返すものに特定のArrayList
メソッドが必要な場合は、を使用してくださいArrayList
。
1.その概念Interface Polymorphism
。
2.持っている方が良いList<My_Obj> arr = new ArrayList<My_Obj>;
3.ある時点でArrayListの代わりにLinkedListを使用したい場合は、その方法について心配する必要はありません。
Listを返す場合は、ライブラリのユーザーがListインターフェイスを実装するものを使用することができます。配列リストまたはリンクリストの場合があります。
私は通常、可能な限り最も一般的なタイプを選択します。この場合、やなど、リストよりもさらに一般的なタイプを返すことができCollection
ますIterable
。
Iterableを返すことにより、コンパイラは呼び出し元のコードがリストに要素を追加しようとするのを防ぎます。Collections.unmodifiableList()
これは、実行時に失敗することに依存するよりもはるかに強力です。
より一般的なタイプを使用すると、将来的に操作する余地も増えます。おそらく、メソッドはメモリ内のソースではなくストリーミングソースからデータをロードすることになります。その場合、IterableはListよりもはるかに適しています。