Pull to refresh

Comments 17

Шел 2019 год.
В яве все еще принято явно указывать типы переменных.
Методы расширения все еще ересь.
Котлин? Не слышали.
Так выпьем же за энтерпрайз ныне, присно и во веки веков!

Обращаю внимание, что речь идет про legacy.
Вы много проектов 10-15 летнего возраста видели на Java9+ или Kotlin?
хипстота скриптовая подтянулась
Начнём с того, что работает Collections.addAll намного быстрее. Об этом можно найти упоминание в JavaDoc этого метода:
The behavior of this convenience method is identical to that of c.addAll(Arrays.asList(elements)), but this method is likely to run significantly faster under most

Это очень вряд ли, на современной JDK. Не существует никакой магии, которая бы позволяла Collections.addAll быть гораздо быстрее. Скорее, наоборот, — c.addAll(Arrays.asList(elements)) может предаллоцировать структуры нужного размера у себя внутри.


То, что вы перечислили как "минусы" Arrays.asList() — это просто случаи, когда он не применим. Когда он применим, однозначно, именно его и нужно использовать (либо ImmutableList.of() из Guava).


Хоть статья про Java 8, можно было бы упомянуть что на новых версиях еще можно использовать List.of()/Set.of().

>List.of()/Set.of().
Можно и что-то типа vavr применить. И вообще если не ограничиваться только JDK, то вариантов много. И некоторые из них лучше описанных.
Добрый день. Подскажите лучшие на Ваш взгляд не-JDK-шные средства если есть время.
Я сконцентрировался на средствах JDK, потому что зачастую проекты могут пользоваться только своими репозиториями при сборке. Там может не быть какой нибудь хорошей библиотеки, вроде гуавы, а добавление библиотеки в какой нибудь nexus происходит не так просто.
>зачастую проекты могут пользоваться только своими репозиториями при сборке
Я бы не обобщал так. Ни разу за 20 лет не видел таких проектов. Чаще всего в моей практике нексус просто является миррором central, а остальные репозитории типа bintray добавляются по запросу без проблем. И это банк, например, где процесс добавления санкционируют безопасники.

Из не JDK думаю что первое что приходит в голову это именно vavr. Там есть свой полноценный набор коллекций, не такой, как в JDK, и это как раз хорошо — есть выбор.

Дальше по-идее все зависит от потребностей — например, persistent collections могут где-то пригодиться. Или trove для кого-то.
Спасибо большое! Посмотрю.
Я видел изолированные репозитории довольно часто. В банках, в некоторых зарубежных проектах.

Trove — нет, это неподдерживаемый проект с кучей багов. fastutil или Eclipse collections.

Вы правы наверное. Я имел в виду, что не JDK коллекции для примитивных типов — это один из тех случаев, про которые спрашивали. Какой из них лучше — я реально не знаю.
Тоже очень удивился комментарию про скорость Collections.addAll, аж в джавадоке.
Оказывается, addAll ArrayList, LinkedList и ArrayDeque копирует коллекцию в массив перед тем как добавить ее. Тогда действительно Collections будет лучше.
Зачем так сделано — непонятно.

В случае ArrayList/ArrayDeque, и копии из другой ArrayList/ArrayDeque/другой array-based коллекции это сводит addAll() к двум операциям System.arraycopy, т. е. поточного копирования памяти. Оно в разы быстрее поэлементного копирования.


Зачем в LinkedList — труднее сказать, но так как LinkedList в принципе никогда не надо использовать, это уже не важно

Подходит к тебе человек и просит написать статью для корпоративного блога. Ты такой: «Ну, ээ...»

Благодаря этой статье я понял, что legacy-код это нечто, написанное студентами, бегло пролиставшими Эккеля в книжном.
Спасибо!

Legacy бывают разные.
В одной компании на протяжении 14 лет код писали исключительно вчерашние студенты (из-за дешевизны). При этом уходили они в среднем через год. Представьте, что там было с кодом.
Еще в одной, весь проект написан полностью на статике. ООП не существовало для его автора.
С другой стороны встречается не мало нормальных проектов. С тестами, прозрачной архитектурой и без костылей с велосипедами

Sign up to leave a comment.