2

Делал тестовое задание на вакансию Junior Android разработчика, в коде была строчка:

ArrayList<String> valNames = new ArrayList<String>();

Мне сказали, что лучше писать так:

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

Потом в одной из статей на habrahabr.ru встретилась фраза:

Подумаешь, большое дело, что человек не понимает почему нужно писать List values = new ArrayList(); вместо ArrayList values = ….; Ну и кому же не хочется увидеть названия в стиле ArrayList arrayList = new ArrayList(); и улыбнуться. Жаль только, что с применением данного антипатерна, все эти, вызывающие улыбку, вещи обычно обнаруживаются после приблизительно месяца работы.

Объясните, почему так писать неправильно. Формально - ошибки нет?

Kromster
  • 13,809
Miller777
  • 153
  • 1
    https://ru.stackoverflow.com/a/600330/191482 ........... https://ru.stackoverflow.com/questions/429978/%D0%9E%D0%B1%D1%8A%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%82%D0%B8%D0%BF%D0%B0-arraylist/429980#comment442376_429980 – Алексей Шиманский Jul 05 '17 at 20:03
  • Благодарю, теперь понятно! – Miller777 Jul 05 '17 at 20:13
  • На деле, ошибки нету, это вопрос того, как принято в данном языке. – VladD Jul 05 '17 at 20:51

2 Answers2

2

Обычно это объясняется так: если кодер объявляет переменную типа ArrayList<String> вместо List<String> - он не понимает что все нужные ему методы уже есть в интерфейсе. Тем самым демонстрируется непонимание основных принципов проектирования, ведь ему на самом деле совсем не требуется именно ArrayList<String>, он может использовать любую другую коллекцию! ... с той же асимптотикой операций... упс.

На самом деле те, кто так пишет, защищаются от автоматических рефакторингов, способных преобразовать переменную конкретного типа в параметр метода, что проявит их непонимание основных принципов проектирования привыкли к IDE, которые подчеркивают такие места желтым и предлагают исправить тип переменной. Это просто привычка.

Для большинства алгоритмов, выдумываемых на ходу, ArrayList<> является единственной коллекцией с адекватными временами выполнения операций и нет никакой разницы какого типа объявлять переменную.

А вот за типами параметров методов или возвращаемых значений надо и правда следить внимательнее, выбирая наименьший подходящий интерфейс - это упростит стыковку кода, написанного разными программистами.

Pavel Mayorov
  • 58,537
  • Спасибо, с этой стороны не смотрел. Привык "прибивать гвоздями" - если нужен ArrayList, значит это будет именно ArrayList. На курсах на этих моментах не акцентировались. – Miller777 Jul 06 '17 at 20:41
0

Это носит больше религиозно/стилистический оттенок, нежели формальный.

Объявление List<String> шире чем декларация ArrayList<String>, то есть когда человек пишет List<String> он типа демонстрирует свою ООП сущность, как бы понимает, что underlying объект может быть и ArrayList и Vector и Stack и т.д. и декларируя List абстрагируется от конкретной реализации.

На самом то деле, насколько это правильно или нет - напоминает дискуссии средневековых схоластов о сущности универсалий

Barmaley
  • 81,300
  • Жесткость оценок, это тоже из раздела схоластики, как известно победители в схоластических спорах заживо сжигали своих оппонентов - так все нормально :) – Barmaley Jul 06 '17 at 06:34
  • Спасибо, я понял! – Miller777 Jul 06 '17 at 20:40