В духе Best Practices: Always return a ____, never a ____, я сталкиваюсь с похожим вопросом в своем предстоящем migration from JDK1.4.2 to JDK5 and more. (Да, I знаю, JDK1.4.2 is EOL! ;-)).API java 5 и более: следует ли возвращать массив или коллекцию?
Для функций, возвращающих коллекции (которые не являются простыми property collections), я всегда предпочитаю (в jdk1.4.2) возвращение массива вместо общего списка, потому что:
- он навязывает возвращающегося типа (
MyObject[]
вместо списка объектов, гораздо более типобезопасного на статическом - как в «компиляции» - уровень) - это наводит на мысль а «только для чтения» символа возвращенной коллекции (это сложнее добавить элемент в коллекции, хотя это не так строго, как ключевое слово «только для чтения» в C#). Это не то же самое, как говорят, что это «неизменное», поскольку ссылки внутри массива по-прежнему могут быть изменены ...
Конечно, я всегда создать Возвращаемый массив (я не подвергать какой-либо " внутренняя ')
Теперь, в JDK5 и более, я мог бы использовать List<MyObject>
, если захочу.
Каковы веские причины для выбора MyObject[]
вместо списка или Collection<MyObject>
при кодировании в java5?
Bonus, если Collection<MyObject>
используется, это возможно:
- применять для чтения атрибут только на возвращаемой коллекции? (нет
add()
илиremove()
возможно) - обеспечить неизменный аспект возвращенной коллекции? (даже ссылки этой коллекции не могут быть изменены)
PS: У JavaGenericFAQ не было этого.
Спасибо! +1 на данный момент (я буду ждать немного для других ответов). Вы можете сказать, что я еще не всерьез прочитал JDK6 javadoc ...;) – VonC 2008-10-22 12:54:38
«Массивы и дженерики не очень хорошо смешиваются. Поэтому, если вы хотите использовать дженерики, вы обычно должны избегать массивов». -> Urg? можете ли вы объяснить эту часть? Мои массивы хорошо сочетаются с моими дженериками ... – Nicolas 2008-10-22 15:05:46
Вы не можете создать массив. Например, если T - общий тип, то «новый T [0]» не компилируется. Вам нужно будет сделать что-то вроде «(T []) нового объекта [0]», который генерирует предупреждение без предупреждения. По той же причине вы не можете использовать общие типы с varargs без предупреждений. – 2008-10-22 15:38:50