Java — широко используемый язык программирования, известный своей универсальностью, стабильностью и масштабируемостью. Однако написание эффективного и высококачественного кода может оказаться непростой задачей. Вот несколько рекомендаций по написанию чистого и оптимизированного кода на Java.

  1. По возможности отдавайте предпочтение примитивам, а не примитивным оболочкам.

Объявление типов-примитивов, таких как long и int, предпочтительнее соответствующих оболочек объектов, таких как Long и Integer, из-за их меньшего объема памяти и лучшей производительности.

2. Используйте побитовый оператор AND, чтобы проверить наличие странностей.

Побитовый оператор И — это более быстрый и эффективный способ проверить, является ли число нечетным или четным, чем использование арифметического оператора по модулю.

public boolean isOdd(int num) {
    return (num & 1) != 0;
}

3. Избегайте избыточной инициализации.

Избегайте инициализации переменных значениями по умолчанию, такими как 0 для int или false для boolean.

String name; 
int speed;
boolean isOpen;

4. Заявляйте о неприкосновенности частной жизни членов класса, когда это возможно.

Чтобы обеспечить инкапсуляцию, лучше всего объявить члены класса как частные и предоставить геттеры и сеттеры для управления ими.

private int age;

5. Избегайте использования ключевого слова new при создании строк.

Использование ключевого слова new при создании строкового объекта является ненужным выделением памяти. Вместо этого используйте строковые литералы, которые хранятся в пуле строк, для повышения производительности.

String s2 = "AnyString";

6. Используйте concat() для объединения возможно пустых строк и + в противном случае.

Для объединения строк используйте concat(), если какая-либо из строк может быть пустой, и используйте + в противном случае. В Java 8 и более поздних версиях также допустимо использование + всех конкатенаций.

String address = streetNumber.concat(" ").concat(streetName)
    .concat(" ").concat(cityName).concat(" ").concat(cityNumber)
    .concat(" ").concat(countryName);

String concat = str1 + str2 + str3;

7. Используйте символы подчеркивания в числовых литералах.

Использование подчеркивания в числовых литералах делает их более читабельными.

int myMoneyInBank = 58_356_823;
long billsToPay = 1_000_000_000L;

8. Используйте расширенный цикл for вместо цикла for с индексами.

Использование расширенного цикла for (также известного как цикл for-each) вместо традиционного цикла for с индексной переменной помогает предотвратить ошибки, которые могут возникнуть при манипулировании индексной переменной.

for (String name : names) {
    saveInDb(name);
}

9. Используйте try-with-resources вместо try-catch-finally.

Оператор try-with-resources — это более лаконичный способ обработки ресурсов, которые необходимо закрыть после использования, таких как потоки ввода-вывода.

try (Scanner scanner = new Scanner(new File("test.txt"))) {
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

10. Избегайте пустых блоков захвата.

Пустые блоки catch затрудняют отладку ошибок. По крайней мере, зарегистрируйте сообщение об ошибке, чтобы упростить отладку.

try {
    productPrice = Integer.parseInt(integer);
} catch (NumberFormatException ex) {
    unreadablePrices.add(productPrice);
    log.error("Cannot read price : ", productPrice);
}

11. Избегайте исключений нулевого указателя.

Избегайте исключений нулевого указателя, возвращая пустые коллекции вместо нулевых элементов, используя класс Optional и метод requireNonNull из класса java.util.Objects.