Объект является нулевым, так как второй вызов метода - PullRequest
1 голос
/ 17 апреля 2019

С помощью следующего кода скрипт входит в блок if (mySet! = null) только при первом вызове метода.

Почему со второго вызова mySet получается null?

Map<Integer, Set<String, String>> mMap;

// ... code to populate the map with correct elements

public String myMethod(int idName)
{
    String html = "";

    Set<String> mySet = mMap.get(idName);
    // Set<String> mySet = new HashSet<>(mMap.get(idName));
    if(mySet != null)
    {
        // the script enters here only at first call?!?!?

        for(String name : mySet)
        {
            html += ", " + name;
        }
        mySet.clear();
    }

    return html;
}

myMethod(1); // return some html
myMethod(1); // return empty html...

Если я заменю эту строку:

Set<String> mySet = mMap.get(idName);

с этой строкой:

Set<String> mySet = new HashSet<>(mMap.get(idName));

работает при каждом вызове.

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

Ответы [ 3 ]

1 голос
/ 17 апреля 2019

As Set - объект типа Reference, поэтому впервые, когда он соответствует условию, а затем очищает набор, теперь набор становится пустым, и поэтому значение, соответствующее 1, становится [] пустым набором.Предположим, что myMap имеет значение: 1, ["1", "2", "3"]

Теперь, когда вы выполняете myMethod(1) в первый раз, он очищает набор, соответствующий значению 1

Теперь значение карты становится: 1, []

Таким образом, он снова удовлетворяет вашему условию if(mySet != null), но ничего не добавляет к переменной html, поскольку набор mySet пуст.Итак, он возвращает пустую переменную html.

1 голос
/ 17 апреля 2019

Это здесь:

Set<String> mySet = new HashSet<>(mMap.get(idName));

создает новый набор, который является копией содержимого, имеющегося на вашей карте.Если вместо этого вы непосредственно работаете с заданным объектом, хранящимся на карте, вы также обновите содержимое «карты».

Вот и все: разница между изменением вашей «корневой» карты данных и обновлением копии этих данных.

0 голосов
/ 17 апреля 2019

Я думаю, вы можете исправить это, клонировать mymap.get (idName) в myset

    public String myMethod(int idName)
{
    String html = "";

    Set<String> mySet = (Set<String>) ((HashSet<String>) mymap(idName)).clone();

    if(mySet != null)
    {
        // the script enters here only at first call?!?!?

        for(String name : mySet)
        {
            html += ", " + name;
        }
        mySet.clear();
    }

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