Как TreeSets как переменные-члены обрабатываются в Enum Singleton - PullRequest
3 голосов
/ 17 января 2012

Это может быть глупый вопрос, но он бросает меня в тупик.

Я реализовал одноэлементный класс (я знаю, что он злой), используя перечисление в Java следующим образом

public enum Edit {

   INSTANCE;

   private TreeSet<String> list1 = new TreeSet<String>();

   public void createList(Scanner input) {
        while (input.hasNext()) {
            list1.add(input.next());
        }

Мой вопрос заключается в том, что происходит с TreeSet, когда вы используете метод createList вболее одного места в приложении?

Например, скажем, первый раз, когда Edit.INSTANCE.createList () вызывается в приложении, 10 строк добавляются в список list1, теперь во второй раз он вызывается, 5 строк добавляются в список1 ....будут ли эти новые 5 строк добавлены в TreeSet с предыдущими 10 строками или они будут добавлены в совершенно другой (новый) TreeSet?

Я знаю, что цель одноэлементного класса - убедиться, что естьодин и только один глобальный экземпляр класса, но верно ли это для переменных члена класса?В приведенном выше примере есть только одна копия list1 или каждый раз, когда вызывается метод createList (), создается новый TreeSet?

Ответы [ 2 ]

3 голосов
/ 17 января 2012

Есть только один экземпляр типа Edit, поэтому есть один TreeSet<String>.

Каждый раз, когда вы вызываете createList, он добавляет дополнительные значения к тому же TreeSet.

Вы говорите:

Я знаю, что цель одноэлементного класса - убедиться, что существует один и только один глобальный экземпляр класса, но верно ли это для члена классапеременные?

Если это не относится к переменным-членам, какой смысл?Вот что интересно в одном экземпляре - он имеет свое собственное состояние.

В общем, очень плохая идея, чтобы перечисление было изменяемым - обычно они предназначены для представления конкретных значений потенциально с поведением.Кроме того, у меня редко бывают изменчивые синглтоны - это приводит к проблемам с многопоточностью и т. Д., Поскольку у вас, естественно, есть общее состояние.

1 голос
/ 17 января 2012

. Будут ли добавлены эти 5 новых строк в TreeSet с предыдущими 10 строками или они будут добавлены в совершенно другой (новый) TreeSet?

Они будут добавлены в тот же экземпляр TreeSet.В любом случае нет другого экземпляра TreeSet для добавления.Это потому, что вмещающий тип Edit объявлен как Enum и содержит только 1 экземпляр INSTANCE.

Если у вас есть два экземпляра, объявленные в типе Edit (INSTANCE1, INSTANCE2;), тогда будет два отдельных TreeSet экземпляра, по одному с каждым INSTANCE членом типа Edit.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...