Telegram Web Link
🎧 JavaFX пример MP3-плеера

Это простой пример mp3-плеера, созданного с помощью JavaFX. Приложение имеет кнопку для открытия и воспроизведения трека, кнопки паузы, возобновления и остановки с соответствующими функциями. Для воспроизведения музыки мы используем класс MediaPlayer -> Класс MediaPlayer предоставляет элементы управления для воспроизведения мультимедиа.

MediaPlayer предоставляет элементы управления pause(), play(), stop() и seek(), а также свойства rate и autoPlay, которые применяются ко всем типам медиа. В коде также представлены свойства balance, mute и volume, которые управляют характеристиками воспроизведения аудио.

Читать

@javatg
🖥 20 приемов работы на Java, которые помогут вам улучшить качество кода

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

1. По возможности отдавайте предпочтение примитивам, а не классам-оболочкам
Long idNumber;
long idNumber; // long занимает меньше памяти, чем Long


2. Попробуйте использовать подходящий тип для вашей переменной

Если два или более типов удовлетворяют вашим функциональным потребностям, используйте тот тип, который занимает меньше места в памяти.

int birthYear;
short birthYear; // лучше, потому что год рождения не может быть пятизначным


int personRunningSpeedKmHour;
byte personRunningSpeedKmHour; // лучше, потому что скорость движения человека ограничена

3. При проверке нечетности числа побитовый оператор AND намного быстрее, чем арифметический оператор по модулю
public boolean isOdd(int num) {
return (num & 1) != 0;
}
// лучший способ проверить нечетность числа


4. Избегайте избыточной инициализации (0, false, null..)
Не инициализируйте переменные с их инициализацией по умолчанию, например, boolean по умолчанию имеет значение false, поэтому избыточно инициализировать его значением false.

String name = null; // избыточно
int speed = 0; // избыточно
boolean isOpen = false; // избыточно


String name;
int speed;
boolean isOpen;
// те же значения в более чистом коде


5. Объявляйте членов класса закрытыми везде, где это возможно, и всегда давайте модификатору доступа максимально ограниченный доступ

public int age; // очень плохо
int age; // плохо
private int age; // хорошо


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

String s1 = new String("AnyString") ; // плохая реализация
// Конструктор создает новый объект и добавляет литерал в кучу

String s2 = "AnyString" ; // хорошо: быстрое создание экземпляра


// Этот ярлык ссылается на элемент в пуле строк и создает новый объект, только если литерал отсутствует в пуле строк.

7. Для объединения нескольких строк используйте StringBuilder или StringBuffer вместо использования оператора +
Оператор + неэффективен, поскольку компилятор Java создает несколько промежуточных объектов String перед созданием окончательной объединенной строки.

StringBuilder или StringBuffer изменяют String без создания промежуточных объектов String.

String address = streetNumber +" "+ streetName +" "
+cityName+" "+cityNumber+" "+ countryName; // плохо


StringBuilder address = new StringBuilder(streetNumber).append(" ")
.append(streetName).append(" ").append(cityName).append(" ")
.append(cityNumber).append(" ").append(countryName); // хорошо

Учтите, что StringBuilder не потокобезопасен, не синхронизирован, но он быстрее, чем StringBuffer, который потокобезопасен и синхронизирован.

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

int myMoneyInBank = 58356823;
int myMoneyInBank = 58_356_823; // лучше читаемый код

long billsToPay = 1000000000L;
long billsToPay = 1_000_000_000L; // лучше читаемый код

9. Избегайте использования “for loop” с индексами
Не используйте for loop с переменной индекса (или счетчика), если вы можете заменить его расширенным циклом for (начиная с Java 5) или forEach (начиная с Java 8). Это связано с тем, что переменная индекса подвержена ошибкам, поскольку мы можем случайно изменить ее в теле цикла или начать индекс с 1 вместо 0.

for (int i = 0; i < names.length; i++)
{ saveInDb(names[i]); }

for (String name : names)
{ saveInDb(name); } // более чистый код


10. Заменяйте try-catch-finally на try-with-resources

Scanner scanner = null;
try
{scanner = new Scanner(new File("test.txt"));
while (scanner.hasNext())
{System.out.println(scanner.nextLine());}}
catch (FileNotFoundException e)
{e.printStackTrace();}
finally
{if (scanner != null)
{scanner.close();}}
// подвержено ошибкам, так как мы можем забыть закрыть сканер в блоке finally

try (Scanner scanner = new Scanner(new File("test.txt")))
{while (scanner.hasNext())
{System.out.println(scanner.nextLine());}}
catch (FileNotFoundException fnfe)
{fnfe.printStackTrace();}
// чище и более лаконично


Читать дальше
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Как перебрать Hashmap с помощью цикла. Понимание Void и Null в Java с примерами

В этом руководстве подробно рассмотрено, как перебирать Hashmap, используя различные типы циклов в Java.

Как перебрать Hashmap в Java с помощью цикла for-each
Один из самых простых способов перебора Hashmap — использование цикла for-each. Вот пример того, как это сделать:

HashMap<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);

for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println("Key: " + key + ", Value: " + value);
}

В этом примере мы сначала создаем новый Hashmap
и добавляем к нему несколько пар ключ-значение. Затем мы используем цикл for-each для итерации по Hashmap, извлекая каждую пару ключ-значение как объект Map.Entry. Затем мы извлекаем ключ и значение из каждого объекта Map.Entry и выводим их на консоль.

Как выполнить итерацию по Hashmap в Java, используя цикл while с итератором.
Другой способ выполнить итерацию по Hashmap — использовать цикл while с итератором. Перед вами пример того, как это сделать:

HashMap<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);

Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Integer> entry = iterator.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println("Key: " + key + ", Value: " + value);
}

Здесь мы снова создаем новый Hashmap и добавляем к нему несколько пар ключ-значение. Затем мы создаем новый объект Iterator с помощью метода entrySet(), который возвращает набор пар ключ-значение в виде объектов Map.Entry. Затем мы используем цикл while с методами hasNext() и next() для перебора набора и извлечения каждой пары ключ-значение. И наконец, мы извлекаем ключ и значение из каждого объекта Map.Entry и выводим их на консоль.

Как перебирать Hashmap Java с помощью for loop с keySet()


В Java метод keySet() — это метод класса java.util.HashMap, который возвращает возвращает установленное представление ключей, содержащихся в Hashmap. Это означает, что он возвращает набор всех ключей в Hashmap, которые можно использовать для перебора ключей или выполнения над ними других операций.

То, что метод keySet() возвращает набор уникальных элементов без дубликатов, связано с тем, что ключи в Hashmap должны быть уникальными, а метод keySet() гарантирует, что возвращаемый им набор ключей не содержит повторяющихся значений.

Мы также можем перебирать Hashmap, используя цикл for с методом keySet(). Вот пример того, как это выполнить:

ashMap<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);

for (String key : map.keySet()) {
Integer value = map.get(key);
System.out.println("Key: " + key + ", Value: " + value);

В данном примере мы снова создаем новый Hashmap и добавляем к ней несколько пар ключ-значение. Затем мы используем цикл for с методом keySet() для итерации по Hashmap, извлечения каждого ключа и использования его для получения соответствующего значения из Hashmap. Затем мы выводим ключ и значение на консоль.

Читать полностью

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🧮Как исправлять исключения в Java — подробное руководство

Это руководство поможет вам научиться исправлять распространенные исключения в Java. Помимо теории, вы увидите примеры кода по исправлению таких проблем.

Общие рекомендации по предотвращению исключений в Java

Чтобы избежать появления каких-либо исключений в Java, важно понимать и следовать рекомендациям по кодированию:

1. Всегда проверяйте ввод пользователя, прежде чем использовать его в своем коде.

2. Используйте блоки try-catch, throws, throw, в зависимости от того, что подходит для конкретного сценария.

3. Не пренебрегайте сообщениями в коде об обработках и наличии ошибок. Это поможет определить и исправить проблемы.

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

5. Следуйте рекомендациям по написанию кода, чтобы избежать исключений, и тщательно тестируйте свой код.

6. Обновляйте свои зависимости API, чтобы убедиться, что вы используете самые последние и самые стабильные версии библиотек и фреймворков.

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

8. Отслеживайте производительность вашего приложения и журналы, чтобы быстро выявлять и устранять любые проблемы.

9. Будьте в курсе передовых практик безопасности, чтобы убедиться, что ваш код безопасен и защищен от любых потенциальных атак.

10. Тщательно документируйте свой код и его исключения, чтобы другим разработчикам было легче его понять и поддерживать.

Читать полностью

@javatg
🖥 Kotlin: вложенный и внутренний классы

Разберемся, в чем основное различие между вложенным и внутренним классами. В Kotlin класс может объявляться внутри другого класса, причем двумя способами.

Читать

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
📝Как инициализировать ArrayList в Java.

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

Как объявить ArrayList со значениями в Java

Объявить ArrayList в Java можно следующим способом:

import java.util.ArrayList;

public class ArrayListTut {
public static void main(String[] args) {

ArrayList<String> people = new ArrayList<>();

}
}


Перед тем, как использовать ArrayList, вы должны сначала импортировать его из одноименного класса: import java.util.ArrayList;.

После этого вы можете создать новый объект ArrayList. В приведенном выше коде мы создали такой объект под именем people.

Обратите внимание, что тип данных ArrayList указывается в угловых скобках: ArrayList<String>.

Несмотря на то, что мы создали объект ArrayList, в нем пока нет элементов. Далее вы узнаете, как добавлять к нему элементы.

Учтите, что вы можете создать ArrayList со значениями/элементами в точке объявления, используя метод add в блоке инициализатора:


import java.util.ArrayList;

public class ArrayListTut {
public static void main(String[] args) {

ArrayList<String> people = new ArrayList<>() {{
add("John");
add("Jane");
add("Doe");
}};

System.out.println(people);
// [John, Jane, Doe]
}
}


Читать полностью

@javatg
🖥 Error Prone Support

Error Prone Support -- это инструмент статического анализа для Java, который выявляет распространенные ошибки во время компиляции.

Это библиотека является расширенной версии
Error Prone с дополнительными средствами проверки ошибок.

🖥 Github
🔍 Документация

#github #java

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🧭Как перебрать Hashmap с помощью цикла

В этом руководстве подробно рассмотрено, как перебирать Hashmap, используя различные типы циклов в Java.

Hashmap — это структура данных, используемая для хранения данных в парах ключ-значение (key-value). Она широко используется во многих языках программирования, включая Java, Python и JavaScript.

Итерация по Hashmap — это обычная операция, которую часто выполняют разработчики. В большинстве случаев ее этапы довольно просты. Сначала вы инициируете Hashmap, затем используете итератор для перебора и, наконец, отображаете результат.

Как перебрать Hashmap в Java с помощью цикла for-each

Один из самых простых способов перебора Hashmap — использование цикла for-each. Вот пример того, как это сделать:

HashMap<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);

for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println("Key: " + key + ", Value: " + value);
}

В этом примере мы сначала создаем новый Hashmap и добавляем к нему несколько пар ключ-значение. Затем мы используем цикл for-each для итерации по Hashmap, извлекая каждую пару ключ-значение как объект Map.Entry. Затем мы извлекаем ключ и значение из каждого объекта Map.Entry и выводим их на консоль.

Читать полностью

@javatg
🖥 Сравнение многопоточных и однопоточных операций при копировании памяти в Java. Как избегать NullPointerException, используя возможности Optional

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

Читать

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
В чем различия между equals и compareTo в Java

Из этого гайда вы узнаете о различиях между методами equals() и compareTo(), а также посмотрите на примеры их применения в языке Java.

Java предоставляет разработчикам два метода для сравнения объектов: equals() и compareTo(). Они используются для сравнения объектов, но при этом у них разные цели и реализации.

Equals()

Метод equals() применяют для сравнения объектов на равенство. Он возвращает true, если два объекта равны, и false, если они не равны. По умолчанию метод equals() в Java сравнивает объекты на основе их расположения в памяти. Иными словами, если у двух объектов одинаковый адрес в памяти, они считаются равными друг другу.

Однако мы можем переопределить реализацию equals() по умолчанию, чтобы сравнивать объекты на основе их свойств. Давайте рассмотрим простой пример, чтобы увидеть, как это работает.
Пример: реализация equals() с идентификатором
Предположим, у нас есть класс Person, который содержит имя и идентификатор (ID). Мы хотим сравнить два объекта Person по их идентификатору, а не по их расположению в памяти. Вот реализация метода equals(), который сравнивает объекты Person по их идентификатору:

public class Person {
private String name;
private int id;

public Person(String name, int id) {
this.name = name;
this.id = id;
}

@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) {
return false;
}

Person person = (Person) o;
return id == person.id;
}
}

В этой реализации мы сначала проверяем аргумент на соответствие null или не является ли он экземпляром класса Person. Если любое из этих условий true, мы возвращаем false. Если аргумент является экземпляром класса Person, мы приводим его к объекту Person и сравниваем его идентификатор с идентификатором текущего объекта. Если идентификаторы равны, то мы возвращаем true, указывая, что два объекта равны.

Продолжение

@javatg
🖥 8 лучших техник программирования в Kotlin

Данная статья предлагает обзор продвинутых техник программирования в Kotlin.

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

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Kotlin Flow: лучшие практики

В этой статье вы познакомитесь с лучшими практиками использования Kotlin Flow, включая создание операторов и обработку ошибок.

Не упустите возможность узнать больше о преимуществах этого инструмента и улучшить свои навыки в разработке мобильных приложений:

https://florentblot.medium.com/kotlin-flow-best-practices-ab05e249ec1c

#kotlin
Параллелизм в Java и интерфейс Condition

Благодаря этой статье вы узнаете, как заставить потоки ожидать определенных условий с помощью интерфейса Condition.

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

public interface Condition {

void await() throws InterruptedException;

void awaitUninterruptibly();

long awaitNanos(long nanosTimeout) throws InterruptedException;

boolean await(long time, TimeUnit unit) throws InterruptedException;

boolean awaitUntil(Date deadline) throws InterruptedException;

void signal();

void signalAll();
}


Интерфейс Condition связан с интерфейсом Lock. Поток не может взаимодействовать с Condition и его методами, если они не удерживаются с помощью Lock.

Condition использует базовые механизмы Lock. Например, signal и signalAll будет использовать базовую очередь потоков, которые поддерживаются Lock, и уведомит их о пробуждении.

Отличие между этими двумя интерфейсами состоит в том, что реализации Lock представляют собой высокоуровневую альтернативу блока synchronized, а реализации интерфейса Condition – это альтернатива методам notify/wait. Оба этих интерфейса входят в пакет java.util.concurrent.locks.

Одной из очевидных вещей, которые реализуются с помощью Condition, является файл BlockingQueue. Рабочие потоки (worker threads) обрабатывают данные, а потоки-издатели (publisher threads) отправляют данные. Данные публикуются в очереди, рабочие потоки будут обрабатывать данные из очереди, а если данных нет в очереди, то они должны находиться в режиме ожидания.

Для рабочего потока, если условие выполняется, процесс работы выглядит следующим образом:

1. Получить lock.
2. Проверить состояние.
3. Обработать данные.
4. Освободить lock.

Если условие не выполняется, процесс изменится:

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

@javatg
🔥 5 фишек Java разработчика

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

1. Гибкость интерфейсов

interface Vehicle {
void start();
void stop();

default void honk() {
System.out.println("Beep beep!");
}
}

class Car implements Vehicle {
@Override
public void start() {
System.out.println("Car started.");
}

@Override
public void stop() {
System.out.println("Car stopped.");
}
}

public class Main {
public static void main(String[] args) {
Car car = new Car();
car.start();
car.stop();
car.honk(); // Использование метода по умолчанию из интерфейса
}
}

2. Обработка исключений

class CustomException extends Exception {
public CustomException(String message) {
super(message);
}
}

public class Main {
public static void main(String[] args) {
try {
// Бросаем исключение CustomException
throw new CustomException("Something went wrong.");
} catch (CustomException e) {
System.out.println("Exception caught: " + e.getMessage());
}
}
}

3. Использование аннотаций

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
String value() default "";
}

public class Main {
@MyAnnotation(value = "Example")
public static void main(String[] args) {
// Получаем аннотацию и выводим значение
MyAnnotation annotation = Main.class.getAnnotation(MyAnnotation.class);
System.out.println("Annotation value: " + annotation.value());
}
}

4. Перечисляемые типы

enum Day {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}

public class Main {
public static void main(String[] args) {
Day today = Day.TUESDAY;
System.out.println("Today is " + today);
}
}


5. Лямбда-выражения

import java.util.ArrayList;
import java.util.List;

public class Main {
public static void main(String[] args) {
List<integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);

// Применение лямбда-выражения для удвоения значений списка
numbers.replaceAll(n -> n * 2);

System.out.println(numbers); // Выводит: [2, 4, 6]
}
}



Подробнее

@javatg
💡Задача: "Матрица спирали"

Условие задачи: дан двумерный массив, надо вернуть все его элементы в "спиральном" порядке по часовой стрелке.

Пример:
Ввод:
matrix = [[1,2,3],[4,5,6],[7,8,9]]
Вывод: [1,2,3,6,9,8,7,4,5]

Ввод: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
Вывод: [1,2,3,4,8,12,11,10,9,5,6,7]

Решение:

class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> answ = new ArrayList<>();
int move[][] = {{0,1},{1,0},{0,-1},{-1,0}};
int x = 0;
int y = -1;
int i = 0;
boolean finish = false;
while (!finish) {
finish = true;
while (true) {
int tmpX = x;
int tmpY = y;
if (x + move[i % 4][0] < matrix.length && x + move[i % 4][0] > -1) x += move[i % 4][0];
if (y + move[i % 4][1] < matrix[0].length && y + move[i % 4][1] > -1) y += move[i % 4][1];
if (x < matrix.length && y < matrix[0].length && matrix[x][y] != -200) {
answ.add(matrix[x][y]);
matrix[x][y] = -200;
finish = false;
}
else {
x = tmpX;
y = tmpY;
break;
}
}
i++;
}
return answ;
}
}


Пишите свое решение в комментариях👇

@javatg
10 полезнейших GitHub-репозиториев для Java-разработчиков

1. Java Design Patterns

2. Interviews

3. Algorithms

4. Realworld

5. Awesome Java

6. Baeldung Tutorials

7. JHipster

8. RxJava Android Samples

9. Java8 Tutorial

10. Cracking the Coding Interview in Java

@javatg
🔥 Выполнение одновременных сетевых запросов в Java: быстро и эффективно

Виртуальные потоки, представленные в Java 19, предназначены для ускорения одновременных сетевых запросов. В данной статье мы сравним пропускную способность обычных и виртуальных потоков, выполняющих HTTP-запросы.

Для этой цели воспользуемся двумя виртуальными машинами в Google Cloud. У каждой из них 8-ядерный процессор и 16 ГБ памяти. Одна машина послужит сервером, а другая — клиентом.

Читать

@javatg
💡Задача: Игра в прыжки

Условие: Вам дан целочисленный массив nums. Изначально вы находитесь в первом индексе массива, и каждый элемент массива представляет максимальную длину прыжка в этой позиции.

Верните true, если вы можете добраться до последнего индекса, или false в противном случае.

Пример:
Ввод: nums = [1,3,1,1,4]
Вывод: true
Объяснение: Переходим на 1 шаг от индекса 0 к 1, затем на 3 шага к последнему индексу.

Ввод: nums = [3,2,1,0,4]
Вывод: false

Решение:

class Solution {
public boolean canJump(int[] nums) {
if(nums[0]==0 && nums.length!=1){
return false;
}
for(int i=1;i<nums.length;i++){
if(i==nums.length-1){
return true;
}
if(nums[i]==0){
int flag=1;
for(int j=i-1;j>=0;j--){
if(nums[j]>flag){
break;
}
if(j==0){
return false;
}
flag++;

}
}
}
return true;
}
}


Пишите свое решение в комментариях👇

@javatg
🖥 Реализации шаблона Singleton, которые вы должны знать

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

Ленивая загрузка
Ленивая загрузка (lazy loading) означает, что вы загружаете синглтон только тогда, когда он вам нужен. Иными словами, вы инициируете экземпляр только при вызове getInstance(). То есть, даже если у вас есть другие статические методы в вашем классе Singleton, которые будут, например, загружать конфигурацию, и эти методы используются для запуска вашего приложения, то процесс инициализации все равно ограничен только методом getInstance(). Таким образом, время запуска вашего приложения не будет зависеть от времени загрузки экземпляра.

Ленивая загрузка в классическом синглтоне
Ленивая загрузка обычно используется в классическом синглтоне. Давайте сначала рассмотрим классический класс Singleton, который используется в однопоточном приложении.

Это простой класс, который можно реализовать там, где у нас есть приватный конструктор, и мы можем вызвать getInstance() для инициализации переменной, если она по-прежнему имеет значение null. Результат должен выглядеть так:

public class Singleton {

private static Singleton instance;

private Singleton() {
}

public static Singleton getInstance() {
if(instance == null){
instance = new Singleton();
}
return instance;
}
}


Синхронизированная отложенная загрузка
Синхронизация может быть немного сложной, поскольку здесь мы можем использовать два разных подхода:

1. Синхронизируем весь метод getInstance().
2. Синхронизируем часть метода.

Давайте реализуем код:

public class ThreadSafeSingleton {

private static ThreadSafeSingleton instance;

private ThreadSafeSingleton() {
}

public static synchronized ThreadSafeSingleton getInstance() {
if(instance == null){
Main.waitTime();
Main.waitTime();
instance = new ThreadSafeSingleton();
}
Main.waitTime();
return instance;
}

public static ThreadSafeSingleton getInstanceOptimized() {
if(instance == null){
synchronized (ThreadSafeSingleton.class){
if(instance == null){
Main.waitTime();
Main.waitTime();
instance = new ThreadSafeSingleton();
}
}
}
Main.waitTime();
return instance;
}
}


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

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
2024/10/03 04:25:18
Back to Top
HTML Embed Code: