Singleton — это шаблон проектирования, ограничивающий создание экземпляров класса одним объектом. Рассмотрим три разных подхода к его реализации.
Создаёт объект только при первом вызове.
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {} // Закрытый конструктор
public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}Оптимизированная версия для многопоточной среды.
public class ThreadSafeSingleton {
private static volatile ThreadSafeSingleton instance;
private ThreadSafeSingleton() {}
public static ThreadSafeSingleton getInstance() {
if (instance == null) {
synchronized (ThreadSafeSingleton.class) {
if (instance == null) {
instance = new ThreadSafeSingleton();
}
}
}
return instance;
}
}synchronized-метода Рекомендуется в современной Java.
public enum EnumSingleton {
INSTANCE;
public void someMethod() {
System.out.println("Enum Singleton!");
}
}LazySingleton удобен, но не подходит для многопоточки. ThreadSafeSingleton решает проблему двойной проверкой, но сложнее. EnumSingleton — самый надёжный способ, рекомендованный Joshua Bloch. Please open Telegram to view this post
VIEW IN TELEGRAM
❤7
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣23
Что это такое?
В Java паттерн Singleton (Одиночка) используется для того, чтобы гарантировать существование только одного экземпляра класса и предоставить к нему глобальную точку доступа. Один из лучших способов реализации паттерна Singleton в современной Java — использовать enum. Это гарантирует, что экземпляр будет создан только один раз, а также позволяет защититься от проблем многозадачности (multi-threading) и сериализации.
Почему это лучший способ?
1. Гарантированная защита от сериализации: Enum типы в Java автоматически обеспечивают защиту от повторной сериализации, что означает, что даже если вы сериализуете и десериализуете объект, он всегда будет одним и тем же экземпляром.
2. Легкость использования: Просто создайте enum с одним элементом, и он будет работать как Singleton.
3. Простота кода: Реализация паттерна через enum гораздо проще и понятнее, чем традиционные способы через класс с приватным конструктором и методами для получения экземпляра.
4. Защита от многопоточности: Enum в Java гарантированно потокобезопасен.
Как использовать Singleton через enum?
Пример кода:
Объяснение:
Все поля и методы класса могут быть такими же, как в обычном классе.
Для доступа к экземпляру используйте
Пример использования:
Почему это удобно?
1. Безопасность при многозадачности: В многозадачной среде enum-тип автоматически позаботится о том, чтобы не создать несколько экземпляров.
2. Никаких проблем с рефлексией: При обычной реализации через класс можно создать новые экземпляры с помощью рефлексии, что нарушает принцип Singleton. В случае enum этого не произойдет.
3. Простота тестирования и расширяемости: Такой подход легко тестировать и можно добавлять новые функции без изменения структуры самого паттерна.
Когда использовать?
Использование enum для реализации Singleton рекомендуется, когда вам нужно:
— Обеспечить, чтобы экземпляр был создан только один раз и не был доступен для повторного создания.
— Потребность в потокобезопасности и защите от возможных ошибок сериализации.
— Желание использовать компактное и понятное решение без дополнительных сложностей.
📍 Теги: #Java #Singleton #Паттерны
В Java паттерн Singleton (Одиночка) используется для того, чтобы гарантировать существование только одного экземпляра класса и предоставить к нему глобальную точку доступа. Один из лучших способов реализации паттерна Singleton в современной Java — использовать enum. Это гарантирует, что экземпляр будет создан только один раз, а также позволяет защититься от проблем многозадачности (multi-threading) и сериализации.
Почему это лучший способ?
1. Гарантированная защита от сериализации: Enum типы в Java автоматически обеспечивают защиту от повторной сериализации, что означает, что даже если вы сериализуете и десериализуете объект, он всегда будет одним и тем же экземпляром.
2. Легкость использования: Просто создайте enum с одним элементом, и он будет работать как Singleton.
3. Простота кода: Реализация паттерна через enum гораздо проще и понятнее, чем традиционные способы через класс с приватным конструктором и методами для получения экземпляра.
4. Защита от многопоточности: Enum в Java гарантированно потокобезопасен.
Как использовать Singleton через enum?
Пример кода:
public enum Singleton {
INSTANCE;
// Пример поля
private int value = 42;
// Пример метода
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}Объяснение:
INSTANCE — это единственный экземпляр вашего класса. Используется стандартный механизм enum для создания этого экземпляра.Все поля и методы класса могут быть такими же, как в обычном классе.
Для доступа к экземпляру используйте
Singleton.INSTANCEПример использования:
public class Main {
public static void main(String[] args) {
// Получение доступа к единственному экземпляру
Singleton singleton = Singleton.INSTANCE;
// Использование метода экземпляра
System.out.println(singleton.getValue()); // Выводит 42
// Изменение значения
singleton.setValue(100);
System.out.println(singleton.getValue()); // Выводит 100
}
}Почему это удобно?
1. Безопасность при многозадачности: В многозадачной среде enum-тип автоматически позаботится о том, чтобы не создать несколько экземпляров.
2. Никаких проблем с рефлексией: При обычной реализации через класс можно создать новые экземпляры с помощью рефлексии, что нарушает принцип Singleton. В случае enum этого не произойдет.
3. Простота тестирования и расширяемости: Такой подход легко тестировать и можно добавлять новые функции без изменения структуры самого паттерна.
Когда использовать?
Использование enum для реализации Singleton рекомендуется, когда вам нужно:
— Обеспечить, чтобы экземпляр был создан только один раз и не был доступен для повторного создания.
— Потребность в потокобезопасности и защите от возможных ошибок сериализации.
— Желание использовать компактное и понятное решение без дополнительных сложностей.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4❤3
Из этого курса вы узнаете, что собой представляет API, как работает и зачем нужен. Рассмотрим примеры использования, способы вызова и тенденции развития.
Курс предназначен для всех, кто хочет понять что такое API и в дальнейшем использовать его в работе.
Вас ожидают: 11 уроков, 10 тестов.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Media is too big
VIEW IN TELEGRAM
В этом видеоролике автор подробно объясняет, зачем Java нужна бизнесу и почему она до сих пор остается одним из ведущих языков программирования.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣25
Многие новички в Java совершают ошибку, забывая, что equals() и hashCode() должны быть согласованы. Это критически важно, если объект используется в HashSet, HashMap и других коллекциях.
class User {
private String name;
public User(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
User user = (User) obj;
return name.equals(user.name);
}
}import java.util.Objects;
class User {
private String name;
public User(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
User user = (User) obj;
return Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
А
Если нет поставьте 👍
Если да поставьте
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍10❤1
Тут объясняют, как серверный код на Python и Java может переживать сбои: повторы, таймауты, graceful degradation и прочие лайфхаки для стабильной жизни.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Please open Telegram to view this post
VIEW IN TELEGRAM
😭21👍5
Конструктор — это особый метод, который автоматически запускается, когда создаётся объект. С его помощью удобно задавать значения для полей объекта.
• Имя конструктора всегда как у класса
• Он не возвращает значение
• Можно сделать несколько конструкторов с разными параметрами
public class User {
String name;
int age;
// Конструктор
public User(String name, int age) {
this.name = name;
this.age = age;
}
void printInfo() {
System.out.println(name + " — " + age + " лет");
}
public static void main(String[] args) {
User u = new User("Анна", 25);
u.printInfo(); // Анна — 25 лет
}
}User мы сразу передаём имя и возраст. Это удобно и сокращает лишний код.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤1👍1