ConcurrentHashMap одноэлементных экземпляров - PullRequest
0 голосов
/ 04 августа 2020

Я видел ответ на quora (https://www.quora.com/Can-we-create-mulitple-instances-of-singleton-classes-in-Java-if-so-how-if-not-then-why), в котором предлагалось создать ConcurrentHashMap экземпляров Singleton, «привязанных к идентифицирующей строке», но я не уверен, как это будет работать. Вот моя попытка:

public class SingletonClass {

static ConcurrentHashMap<String, SingletonClass> list = new ConcurrentHashMap<String, SingletonClass>();

private static SingletonClass instance = null;

static String name;

public SingletonClass() {
    this.name = "";
}

public SingletonClass(String name) {
    this.name = name;
}

public SingletonClass getInstance(String key) {
    SingletonClass result = list.get(key);
    if(result == null) {
        instance = new SingletonClass(name);
        list.putIfAbsent(key, instance);
        result = instance;
    }
    return result;
}

public String getName() {
    return this.name;
}

public void setName(String name) {
    this.name = name;
}

И я понятия не имею, как действовать или как создать экземпляр этого и сохранить ключ, пару значений в списке, а затем снова получить значение в зависимости от указать c ключ? Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 04 августа 2020
  • вы создаете несколько экземпляров, тогда как это синглтон? Это не
  • getInstance() должно быть stati c в любом случае
  • вы используете переменную stati c в своем методе getInstance() без причины, вы открываете этот код для таким образом, гоночные условия (ну, несколько гоночных условий). И эта переменная не нужна, делайте все в рамках этого метода
  • это не одноэлементный шаблон, это пул объектов из легковес объектов - то же, что и оболочка классы (Integer, Long et c.) в Java

Дело в том, что при таком подходе не будет двух объектов с одинаковым ключом.

// with your approach
SingletonClass one = SingletonClass.getInstance("someKey");
SingletonClass two = SingletonClass.getInstance("someKey");

System.out.println(one == two); // true, same object

// without your approach
SingletonClass three = new SingletonClass("someKey");
SingletonClass four = new SingletonClass("someKey");

System.out.println(three == four); // false, different objects

Экономия памяти, возможно, время на создание объекта и, возможно, время на g c циклов.

...