2013-12-04 3 views
0

Вот два способа констатирующее Список_массивовКакой лучший способ объявления Список_массивов

1. List<String> l1 = new ArrayList<String>(); 
2. ArrayList<String> l2 = new ArrayList<String>(); 

Мой вопрос заключается в чем разница между этими двумя декларации.

И какой лучший способ объявить арраиста?

+3

3. «Список l3 = новый ArrayList <>();' начиная с Java7. – Pshemo

ответ

1

Основное отличие состоит в том, что в первом вы говорите, что тип l1 является интерфейсом List<T>, тогда как во втором случае, типа l2 является конкретной реализацией (из List<T>) ArrayList<T>.

Я хотел бы использовать первую форму:

List<String> l1 = new ArrayList<String>(); 

типа с использованием интерфейсов, так что вы можете переключаться реализаций легко позже. Вторая реализация тесно связана с реализацией List. Поэтому, если вы захотите позже изменить реализации (скажем, LinkedList<T>), у вас будет много рефакторинга (изменение подписи методов и т. Д.). Однако, если вы использовали первый подход, вы можете просто заменить реализацию, не требуя дополнительного рефакторинга.

Использование интерфейса также заставляет вас кодировать код договора интерфейса, чем любая конкретная конкретная реализация.

+0

Беседа: вы когда-нибудь хотели сделать это в случае списка? Я использую интерфейс, потому что он меньше печатает, а не потому, что он больше подключается и воспроизводится;) – Gimby

+0

Ха-ха, я не могу думать о ситуации с моей головы, где я должен был это сделать, но есть определенные производительность гарантирует, что вы получите при использовании одной реализации по сравнению с другими. Поэтому, если при профилировании вы можете сузить проблему производительности, поскольку из-за использования неоптимального (в этом конкретном контексте) реализации «List » вы можете попробовать использовать другую реализацию, а затем профилировать снова. В этом случае замена реализации намного проще, потому что вы использовали интерфейс как тип. –

0

Используйте первый подход, так как он позволит вам переназначить ссылку на другой подкласс позднее.

BTW, я никогда не видел, чтобы кто-то использовал второй подход.

Смежные вопросы