2020-02-19

Java: collections to array

From habr:

С конвертацией коллекций в массивы у Java была непростая история. С момента появления Collection в Java 1.2 было два способа создания массива на основе коллекции:

  • Использовать метод [Collection.toArray()](https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/util/Collection.html#toArray()), который возвращает Object[].
  • Использовать метод Collection.toArray(Object[]), который принимает уже созданный массив и заполняет его. Если переданный массив недостаточной длины, то создаётся новый массив нужной длины того же типа и возвращается. С появлением дженериков в Java 1.5 метод логичным образом поменял свою сигнатуру на [Collection.toArray(T[])](https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/util/Collection.html#toArray(T%5B%5D)).

Загвоздка в том, что если нужен массив конкретного типа (допустим String[]), второй метод можно использовать двумя способами:

  • Использовать конструкцию collection.toArray(new String[0]). Тем самым, мы сознательно почти всегда отбрасываем массив, а передаём его туда, чтобы метод узнал тип массива.
  • Использовать конструкцию collection.toArray(new String[collection.size()]). В этом случае массив передаётся нужной длины, а значит ничего зря не отбрасывается, и код по идее работает быстрее. К тому же здесь не нужен рефлективный вызов.

Таким образом, второй вариант долгое время считался основным, и в IntelliJ IDEA даже была инспекция, которая подсвечивала первый вариант и предлагала конвертировать его во второй, более эффективный.

Однако в 2016 году вышла статья Алексея Шипилёва, где он решил досконально разобраться в этом вопросе и пришёл к выводу, что не-а: первый вариант всё-таки быстрее (по крайней мере в версиях JDK 6+). Эта статья получила большой резонанс, и в IDEA решили изменить инспекцию, сделав у неё три опции: предпочитать пустой массив (default), предпочитать преаллоцированный массив или предпочитать то или иное в зависимости от версии Java.
tags:

2020-02-17

Coupling and cohension

Quote from habr

Принцип единственной ответственности возник как попытка объединения двух важных понятий структурного анализа и проектирования: coupling (сопряжение, зацепление, связанность) и cohesion (сплочённость, связность, прочность модуля).

Как это было

Модуль A связан с модулем B, или что тоже самое, модуль B связан с модулем А, только тогда когда существует передача информации между ними.

Модуль A зависит от модуля B, а модуль B не зависит от A, если изменения в спецификации А никогда не приведут к изменениям кода в B, а изменения в спецификации B могут приводить к изменениям кода в A.

Существует также альтернативная формулировка:

Модуль A зависит от модуля B, а модуль B не зависит от A, если удаление модуля B приводит к нарушениям в работе A.