内部的にデータのリストを格納するクラスがあるとしましょう。
import java.util.List;
public class Wrapper
{
private List<Integer> list;
public Wrapper(List<Integer> list)
{
this.list = list;
}
public Integer get(int index) { return list.get(index); }
}
この例のために、それが有用で必要な抽象化であると偽ってください。さて、ここに私の懸念があります:このクラスの基礎となる実装を知っているプログラマーとして、コンストラクターで要求するリストのタイプについて具体的にする必要がありますか?実証するために、私はこのテストを行いました:
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
public class Main
{
public static void main(String[] args)
{
long start;
List<Integer> list1 = new ArrayList<Integer>();
List<Integer> list2 = new LinkedList<Integer>();
Wrapper wrapper1, wrapper2;
for(int i = 0; i < 1000000; i++)
{
list1.add(i);
list2.add(i);
}
wrapper1 = new Wrapper(list1);
wrapper2 = new Wrapper(list2);
start = System.currentTimeMillis();
wrapper1.get(500000);
System.out.println(System.currentTimeMillis() - start);
start = System.currentTimeMillis();
wrapper2.get(500000);
System.out.println(System.currentTimeMillis() - start);
}
}
ご存知かもしれませんが、リンクリストでは、配列ではなく、要素にランダムにアクセスするのに少し時間がかかります。では、Wrapperコンストラクターに戻ると、一般的で任意のタイプのリストを許可する必要がありますか、それともユーザーがArrayListを渡して、可能な限り最高のパフォーマンスを確保するように指定する必要がありますか?この例では、メソッドgetの基本的な実装が何であるかをユーザーが推測するのは簡単かもしれませんが、これはもっと複雑なことであると想像できます。前もって感謝します!