Pascal4eg / Java

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

Рекурсия

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) и обеспечивает более безопасную и чистую обработку возможных отсутствующих значений.

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

Nashorn

public static void main(String[] args) throws ScriptException, NoSuchMethodException {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
    Invocable invocable = (Invocable) engine;
    engine.eval("var StringBuilder = Java.type('java.lang.StringBuilder')");
    engine.eval("var sb = new StringBuilder();");
    engine.eval("function add(str) { sb.append(str); }");
    engine.eval("function toString() { return sb.toString(); }");

    invocable.invokeFunction("add", "Hello");
    invocable.invokeFunction("add", " scripting!");
    System.out.println(invocable.invokeFunction("toString"));
    // Hello scripting!
}

Nashorn — это движок JavaScript, разработанный на языке программирования Java первоначально Oracle, а затем сообществом OpenJDK. Nashorn был включен в JDK в версии Java 8 и до Java 14. С Java 15 его нужно подключать явно.

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

Системы сборки в мире Java

🛠 Системы сборки в мире Java — это незаменимые инструменты, которые делают процесс разработки проще и эффективнее.

Что бы ваш код стал работающим приложением, его нужно собрать в файл который можно запустить. Это может быть .war или .jar файл.

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

Weak Reference: Слабая связь с объектами

В мире Java, WeakReference - это мощный инструмент для управления памятью. Он позволяет создавать ссылки на объекты, которые могут быть автоматически удалены сборщиком мусора, если на них больше нет сильных ссылок (обычная ссылка на объект).

Чем это полезно? Это помогает избежать утечек памяти в приложениях, где объекты могут оставаться неиспользуемыми, но все еще иметь сильные ссылки.

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

🚀🧵 Гармония в параллельном мире Java: Thread-Safe

В мире Java, параллельное выполнение потоков - это норма. Однако без должных мер предосторожности, оно может привести к состоянию гонки (race condition) и ошибкам. Вот почему важно понимать и применять концепцию Thread-Safe.

Thread-Safe означает, что ваш код или структуры данных могут безопасно использоваться из множества потоков, не вызывая нежелательных конфликтов. Как добиться Thread-Safety:

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