Как передать Integer по ссылке

140
18 ноября 2019, 12:50

В главном потоке создаётся объект, в данном случае типа Integer. После этого создаётся побочный поток, который этот объект как-то меняет, на этом его работа заканчивается. И продолжается работа main, где просто выводим значение этого изменённого(как мы этого ожидаем) объекта. Но в результате вмето 10 получаем всё тот же 0, будто бы никаких изменений в побочном потоке и не было. Но вот если этот Integer упаковать ещё во что-то, всё будет ок, и получим на выходе 10.

Подскажите, что я упускаю при работе с Integer?

public class Runner {
    static class ChangeInteger extends Thread{
        Integer i;
        public void run(){
            while(i < 10){
                System.out.println(i);
                increment();
            }
        }
        void setInteger(Integer value){
            i = value;
        }
        private void increment(){
            i++;
        }
    }

    public static void main(String[] args) {
        ChangeInteger CI = new ChangeInteger();
        Integer mainInt = 0;
        CI.setInteger(mainInt);
        CI.start();
        try {
            CI.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(mainInt);
    }
}
Answer 1

Integer иммутабелен. Если вы хотите передать его по ссылке с возможностью изменения, то пишите свой врапер и передавайте его.

public class MyWrapInt{
    public int value;
}

Или используйте что-нибудь готовое, тот же AtomicInteger. У него есть метод set для изменения значения.

READ ALSO
int + &#39;\n&#39; - что происходит при таком условии?

int + '\n' - что происходит при таком условии?

При изучении в java цикла for написала простой цикл, который должен выводить все четные числа до 100 и оставлять между ними строкуЯ нашла в итоге...

112
Подбор чисел из массива с суммой большей или равной К

Подбор чисел из массива с суммой большей или равной К

Перечитал много материала, задача о ранце не подходит, потому что значение нужно либо большее (с минимальной разницей), либо равное заданному...

134
Сохранение файлов программы (Java, Android) [дубликат]

Сохранение файлов программы (Java, Android) [дубликат]

На данный вопрос уже ответили:

135
Как сохранить вложенную запись из JSON в SQLite?

Как сохранить вложенную запись из JSON в SQLite?

Я получаю данные в таком виде:

160