この 2 つのステートメントを ArrayList 定義に使用します。
ArrayList<String> my = new ArrayList<>();
List<String> my2 = new ArrayList<>();
どちらを使用すればよいですか?
2 番目の定義では、後で ArrayList コンストラクターを、LinkedList や高性能リスト、または将来存在する可能性のあるその他の種類のリストなど、別の種類のリストに置き換えることができます。最初の定義では、ArrayList の実装に永遠に縛られています。コードの残りの部分は、この参照が明示的に ArrayList であることを信頼しているため、これを変更することはできません。
反対に、インターフェイスを使用すると、コードは特定の実装 (ArrayList など) ではなく、インターフェイスのコントラクトに依存します。これにより、ユーザーに影響を与えることなく実装を変更できるようになります。物事の変化を防ぐことはできないからです。
必要なものによって異なります。通常、可能であればインターフェイス(したがってリスト)を使用することをお勧めします。そうしないと、実装クラスに固執します。たとえば、あるメソッドの入力パラメーターとしてArrayListを使用するとします。何らかの理由(パフォーマンスなど)で、ある時点でArrayListからLinkedListに切り替えることにしました。したがって、入力パラメータのタイプも変更する必要があります。インターフェイス(リスト)を使用すると、コードをリファクタリングすることなく、実装をより自由に切り替えることができます。
後者。実装ではなく、インターフェースに対してプログラムします。