2302 - Java - урок 9

preview_player
Показать описание
Это девятый урок по Java по программе 23 ФЕВРАЛЯ.

Сегодня вы узнаете что такое Enum (энумерация) и для чего она нужна в Java, а также как использовать смежные с ней технологии: EnumMap и EnumSet.
Рекомендации по теме
Комментарии
Автор

и исходники примеров есть где-нибудь (копипаст -наше все;)?

now.
Автор

Наткнулся на такую интересность с квадратными скобками в коде моего ментора
"public static void main(String args[])"
Скомпилировалось и отработало как положено. Выходит их расположение не критично?
Ментор пока не ответил, позже приложу его ответ.

USER
Автор

Про StringBuilder какая-то несуразность сказана. Оператор + с хотя бы одним объектным нечисловым операндом неявно переопределён в использование StringBuilder-а (До Java 5 - StringBuffer-а). Тоесть создаётся новый экземпляр StringBuilder-а, затем нужное количество раз вызывается метод append() и в конце вызывается toString(). Использовать это в цикле не рекомендуется, поскольку каждая итерация будет создавать новые промежуточные экземпляры классов StringBuilder и String. Тоесть это неэффективное использование памяти и добавление нагрузку на сборщик мусора.

И ещё немного об эффективности кода. Писать for (char c : str.toCharArray()) неэффективно. str.toCharArray() возвращает не уже существующий массив символов, а его копию, на создание которой ушло процессорное время и память. Эффективно написать for (int i = 0, j = str.size(); i < j; i++) и получать символ при помощи str.charAt() внутри цикла.

После того, как мы распечатали слово нет надобности создавать StringBuilder заново и это так же неэффективно. Лучше продолжать использовать его изначально созданный экземпляр. В этом случае после создания слова нужно просто вызвать word.setLength(0). При этом не только не будет пересоздаваться сам StringBuilder, но так же и его внутренний массив символов. Такой подход оправдан, поскольку слова любого человеческого языка имеют небольшую длину. Если же нам _иногда_ может встретиться очень длинная последовательность беспробельных символов, мы можем захотеть всё таки пересоздать внутренний массив символов, чтобы освободить память. Для этого можно использовать метод trimToSize(). К сожалению нет метода trim с неким коеффициентом, который добавлялся бы к длине массива, чтобы сразу создавать его немного большей длины, как это сделано в конструкторе.

Далее произошёл отказ от использования StringBuilder в пользу немедленного распечатывания на экран. Это конечно работает и это достаточно эффективно, но имеет мало общего с реальной жизнью. В реальной жизни этот парсер использовался бы не просто для распечатывания слов на экран, а для какого-то их дальнейшего анализа. В этом случае слова всё таки нужно создавать в виде отдельных объектов.

Вызов stateMap.get(state).get(type) небезопасен. Если первый get() вернёт null, произойдёт NullPointerException. Произойти это может если мы добавили поддержку нового state, но забыли внести его в stateMap.

שלוםעליכם-תס