Страницы

Поиск по вопросам

вторник, 16 октября 2018 г.

Абстрактный класс-Singleton на java

Некоторое время назад писал на юнити. Использовал на шарпе такой класс:
public abstract class MySingleton { private static T _instance;
public static T Instance { get { if (_instance == null) _instance = (T)Activator.CreateInstance(typeof(T));
return _instance; } }
public static void ForgetInstance() { _instance = default(T); }
protected MySingleton() {
}
Можно ли как-то извернуться, чтобы написать похоже на java?
В лоб то, говорит: "Cannot make a static reference to the non-static type T"


Ответ

Как я понимаю, хочется хранить по одному объекту для каждого запрошенного класса, созданному с помощью конструктора по умолчанию. Для этой цели можно завести ConcurrentHashMap, Object>
import java.util.concurrent.ConcurrentHashMap;
public class MySingleton { private static ConcurrentHashMap, Object> map = new ConcurrentHashMap<>();
@SuppressWarnings("unchecked") public static T getInstance(Class clazz) { T object = (T) map.get(clazz); if(object == null) { try { object = clazz.newInstance(); } catch (IllegalAccessException | InstantiationException | SecurityException ex) { throw new RuntimeException(ex); } T oldObject = (T) map.putIfAbsent(clazz, object); if(oldObject != null) // ой, другой поток вперёд успел return oldObject; } return object; }
public static void forgetInstance(Class clazz) { map.remove(clazz); } }
Соответственно использовать как-то так:
public static void main(String[] args) { String str = MySingleton.getInstance(String.class); String str2 = MySingleton.getInstance(String.class); System.out.println(str == str2); // true MySingleton.forgetInstance(String.class); }

Комментариев нет:

Отправить комментарий