Допустим, у меня есть класс, который внутренне хранит список данных:
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); }
}
Ради этого примера представьте, что это полезная и необходимая абстракция. Теперь вот мое беспокойство: как программисту, который знает базовую реализацию этого класса, должен ли я указать, какой тип List я запрашиваю в конструкторе? Чтобы продемонстрировать, я сделал этот тест:
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, должен ли я быть общим и разрешать любой тип List, или я должен указать, что пользователь передает ArrayList для обеспечения наилучшей возможной производительности? Хотя в этом примере пользователю может быть легко угадать, какова базовая реализация метода get , вы можете представить, что это что-то более сложное. Заранее спасибо!