Делал тестовое задание на вакансию 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(); и улыбнуться. Жаль только, что с применением данного антипатерна, все эти, вызывающие улыбку, вещи обычно обнаруживаются после приблизительно месяца работы.
Объясните, почему так писать неправильно. Формально - ошибки нет?
Обычно это объясняется так: если кодер объявляет переменную типа ArrayList<String>
вместо List<String>
- он не понимает что все нужные ему методы уже есть в интерфейсе. Тем самым демонстрируется непонимание основных принципов проектирования, ведь ему на самом деле совсем не требуется именно ArrayList<String>
, он может использовать любую другую коллекцию! ... с той же асимптотикой операций... упс.
На самом деле те, кто так пишет, защищаются от автоматических рефакторингов, способных преобразовать переменную конкретного типа в параметр метода, что проявит их непонимание основных принципов проектирования привыкли к IDE, которые подчеркивают такие места желтым и предлагают исправить тип переменной. Это просто привычка.
Для большинства алгоритмов, выдумываемых на ходу, ArrayList<>
является единственной коллекцией с адекватными временами выполнения операций и нет никакой разницы какого типа объявлять переменную.
А вот за типами параметров методов или возвращаемых значений надо и правда следить внимательнее, выбирая наименьший подходящий интерфейс - это упростит стыковку кода, написанного разными программистами.
Это носит больше религиозно/стилистический оттенок, нежели формальный.
Объявление List<String>
шире чем декларация ArrayList<String>
, то есть когда человек пишет List<String>
он типа демонстрирует свою ООП сущность, как бы понимает, что underlying объект может быть и ArrayList
и Vector
и Stack
и т.д. и декларируя List
абстрагируется от конкретной реализации.
На самом то деле, насколько это правильно или нет - напоминает дискуссии средневековых схоластов о сущности универсалий
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Всем привет! Простите за нубский вопрос, но можно ли использовать условие в сеттере? В решаемой задаче получаемое значение должно соответствовать...
Есть файл из которого я считаю пути к файлам, заношу в список и дальше считаю сколько в этих путях файлов
Начал изучать android Такая проблема, не вызывается метод onCreate()Создал тестовую активность TestActivity