Pascal4eg / Java

 Java | Фишки и трюки

Тернарный оператор

public int max(int a, int b) {
    return a > b ? a : b;
}

Тернарный оператор (также известный как условный оператор) - это сокращенная форма записи условного выражения.

Он имеет следующий синтаксис:
условие ? значение_если_истина : значение_если_ложь;

Читать дальше

Множественное присваивание

int a, b, c;
a = b = c = 5;
System.out.println(a); // 5
System.out.println(b); // 5
System.out.println(c); // 5

Операция присваивания работает следующим образом: сначала вычисляется значение выражения в правой части, потом это значение присваивается переменной, которая размещается в левой части от знака ‘=‘.

Операция присваивания может иметь вид цепочки:
переменная1 = переменная2 = выражение;

Читать дальше

Библиотека Lombok

import lombok.Data;

@Data
public class Person {
    private String name;
    private int age; 
}

Разрабатывая на Java, мы сталкиваемся с множеством рутинных операций, связанных с написанием геттеров, сеттеров, equals, hashCode и других стандартных методов. Есть способ существенно упростить этот процесс. В этом нам поможет библиотека Lombok!

Lombok – это основанная на аннотациях библиотека Java, позволяющая сократить шаблонный код. В Lombok предлагаются различные аннотации, цель которых – заменить ненужный повторяющийся код, писать который утомительно. Например, Lombok избавит вас от написания безаргументных конструкторов, методов toString(), equals() и hashCode(), для этого нужно просто добавить несколько аннотаций. Плюс, эта библиотека подключается прямо к вашей IDE, поэтому работа воспринимается так, словно вы написали весь шаблонный код сами.

Читать дальше

🍝 Спагетти-код: когда разработка становится беспорядком

Спагетти-код – это одна из самых неприятных "болезней" в мире программирования. Этот термин используется для описания плохо организованного и труднопонимаемого кода, который напоминает спагетти – пасту, перепутанную в неразгадываемую массу.

Почему спагетти-код возникает?

  1. Недостаток планирования: Недостаточное предварительное проектирование приложения может привести к хаотичной разработке, когда каждая часть кода создается независимо от других.
  2. Отсутствие структуры: Если разработчики не следят за структурой проекта, код может быстро превратиться в беспорядок.
  3. Отсутствие документации: Неадекватно задокументированный код может сделать его понимание и редактирование настоящим испытанием.
  4. Недостаток опыта: Новички в программировании могут создавать спагетти-код из-за отсутствия опыта и знаний о лучших практиках.
Читать дальше

Рекурсия

public class Factorial {
    public static void main(String[] args) {
        int num = 6;
        long factorial = factorial(num);
        System.out.println("Factorial of " + num + " = " + factorial);
        // Factorial of 6 = 720
    }

    /**
     * Вычисляет факториал переданного числа
     * @param num значение для которого нужно вычислить факториал
     * @return результат
     */
    public static long factorial(int num) {
        if (num == 1) {
            return 1;
        }
        return num * factorial(num - 1);
    }
}

🔁 Рекурсия — определение, описание, изображение какого-либо объекта или процесса внутри самого этого объекта или процесса, то есть ситуация, когда объект является частью самого себя.

В программировании рекурсия — вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная или косвенная рекурсия).

Читать дальше

Liquibase

Liquibase - это мощный инструмент для управления изменениями в схеме базы данных. Он позволяет разработчикам и администраторам баз данных эффективно управлять эволюцией структуры базы данных в течение всего жизненного цикла приложения.

Вот несколько ключевых особенностей Liquibase:

  1. Контроль версий: Liquibase предоставляет механизм для контроля версий схемы базы данных. Вы можете определить изменения в формате XML, SQL, YAML и других, и Liquibase отслеживает, какие изменения уже были применены к базе данных, и какие ещё предстоит применить.
  2. Кросс-платформенность: Liquibase поддерживает множество СУБД, включая PostgreSQL, MySQL, Oracle, Microsoft SQL Server и многие другие. Это позволяет разработчикам использовать один и тот же инструмент для управления изменениями в разных системах.

...

Читать дальше

Интернирование строк (string intern)

String s1 = "Hello, World!";
String s2 = new String("Hello, World!").intern();
String s3 = "Hello, World!";
String s4 = new String("Hello, World!");

System.out.println(s1 == s2);
// true, так как s2 ссылается на интернированный экземпляр строки

System.out.println(s1 == s3);
// true, так как s3 ссылается на интернированный экземпляр строки

System.out.println(s1 == s4);
// false, так как s4 ссылается на новую строку, созданную в памяти

Интернирование строк (string intern) - это процесс хранения одной и той же строки только в одном экземпляре в пуле строк (string pool) для оптимизации использования памяти и ускорения сравнения строк.

Вместо того чтобы создавать новый объект строки каждый раз, когда вы используете литерал строки (например, "Hello, World!"), Java проверяет, существует ли уже такая строка в пуле строк. Если она там есть, Java использует существующий экземпляр строки, иначе создает новый и добавляет его в пул строк.

Читать дальше

Порядок инициализации объекта

Инициализация это процесс задания начальных значений переменным и объектам перед их использованием. Этот процесс необходим для того, чтобы обеспечить корректное начальное состояние переменных и объектов в программе.

Читать дальше

volatile

volatile - это ключевое слово, которое может быть применено к переменным. Ключевое слово volatile играет важную роль в управлении видимостью и синхронизацией данных между потоками. Когда переменная объявлена как volatile, это означает, что операции чтения и записи этой переменной будут синхронизированы между потоками.

Читать дальше

Optional

// Создаем Optional с пустым значением
Optional<String> emptyOptional = Optional.empty();

// Создаем Optional с непустым значением
Optional<String> nonEmptyOptional = Optional.of("String value");

// Можем там же создать Optional с возможностью отсутствия значения
Optional<String> optionalWithNullable = Optional.ofNullable(null);

// Проверяем, есть ли значение в Optional, и выполняем действие при его наличии
if (nonEmptyOptional.isPresent()) {
    System.out.println(nonEmptyOptional.get()); // String value
}

// Используем метод orElse для предоставления альтернативного значение,
// если значение отсутствует
String result = emptyOptional.orElse("default");
System.out.println(result);  // default

Optional представляет собой класс, введенный в Java 8, который предназначен для борьбы с проблемами, связанными с отсутствием значения (null) и обеспечивает более безопасную и чистую обработку возможных отсутствующих значений.

Читать дальше