В этой статье я подобрал 7 простых, но эффективных практик для начинающих Java разработчиков.
Отдаем предпочтение «ленивой» инициализации
Желательно создавать или инициализировать объекты только тогда, когда это необходимо. Например, ленивая инициализация полезна, когда сам процесс инициализации связан с какой-либо тяжелой операцией, например запрос в БД.
Для проверки строки на пустоту используем метод isEmpty()
Есть несколько вариантов проверки строки на пустоту. Одним из самых популярных является метод equals("")
— не стоит так писать.
Лучшим способом проверить строку на пустоту является использование метода isEmpty()
. Этот метод просто сравнивает длину строке с нулем, используя метод length()
, поэтому эта операция является менее затратной.
Смотрим исходный код этих методов:
Исходный код isEmpty()
:
1 2 3 |
public boolean isEmpty() { return value.length == 0; } |
Исходный код equals()
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; } |
Разница очевидна.
Возвращаем пустые коллекции вместо null
Если функция возвращает пустую коллекцию, то нам нужно убедиться, что возвращается именно пустая коллекция, а не null
. Это избавит от дополнительных проверок на null
:
1 2 3 |
public List<Student> getStudents() { return students == null ? Collections.emptyList() : students; } |
Используем строки с умом
Если две строки объединяются с помощью «+» в цикле for
, то каждый раз создается новый объект String. Это увеличивает потребление памяти и время выполнения кода, особенно при работе с большим объемом данных. Также стараемся не использовать конструктор при создании строки:
1 2 3 4 5 |
// медленно String string1 = new String("Это Java"); // быстро String string2 = "Это Java"; |
Для объединения строк используем специальный класс StringBuilder
.
Используем примитивы вместо классов-оболочек
Классы-оболочки работают медленнее примитивов, поскольку они хранят дополнительную информацию, а примитивы — это лишь значения.
Иногда мы можем сделать ошибку в коде, используя класс-оболочку, например:
1 2 3 4 5 6 7 8 |
int x = 3; int y = 3; Integer xInt = new Integer(3); Integer yInt = new Integer(3); System.out.println(x == y); System.out.println(xInt == yInt); |
Первый вывод на экран напечатает true
, второй выведет false
. Проблема в том, что для сравнения двух объектов — оболочек нельзя использовать оператор ==
, поскольку он сравнивает ссылки, а не фактическое значение.
Стараемся не бросать java.lang.Exception
Стараемся не бросать java.lang.Exception
, так как это противоречит цели использования исключений. Нужно бросать более конкретные исключения или создавать свои, если не нашли подходящего для конкретной ситуации.
Правильно обрабатываем NullPointerException
Исключение NullPointerException
является одним из самых распространенных в Java. Оно возникает, когда мы пытаемся обратиться к методу или полю объекта, который ссылается на null
. В этом случае некоторые начинающие программисты обрабатывают NullPointerException
с помощью конструкции try-catch-finally
. Правильным способом является проверка поля на null
:
1 2 3 4 |
int studentsCount = 0; if(college.listStudents() != null) { studentsCount = college.listStudents().count; } |
Вот такая небольшая заметка для начинающих Java разработчиков. Следите за обновлениями!