Есть ли в Java изменяемые типы для Integer, Float, Double, Long? - PullRequest
67 голосов
/ 23 декабря 2010

Я нахожусь в ситуации, когда я хочу использовать изменяемые версии таких вещей, как Integer.Нужно ли использовать эти классы (ниже) или в Java что-то встроено?

http://www.java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm

Ответы [ 7 ]

75 голосов
/ 23 декабря 2010

Вы всегда можете обернуть значение в массив, например, int[] mutable = {1};, если включать код для изменяемого класса-оболочки слишком громоздко.

45 голосов
/ 23 декабря 2010

Нет, в Java их нет. И это не случайно.Использование изменяемых типов опасно, так как ими легко злоупотреблять.Кроме того, это действительно легко реализовать.Например, commons-lang имеет MutableInt.

40 голосов
/ 13 августа 2012

С версии JDK 1.5 Java теперь имеет java.util.concurrent.atomic.AtomicInteger

Это потокобезопасное изменяемое целое число, пример использования:

final AtomicInteger value = new AtomicInteger(0);

затем позже:

value.incrementAndGet();
8 голосов
/ 31 июля 2014

Вот небольшой класс, который я создал для изменяемого целого числа:

public class MutableInteger {
    private int value;
    public MutableInteger(int value) {
        this.value = value;
    }
    public void set(int value) {
        this.value = value;
    }
    public int intValue() {
        return value;
    }
}

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

7 голосов
/ 23 декабря 2010

Вы можете использовать nnnn [] в качестве изменяемого объекта для любого примитивного типа, как предполагает @Alexandre, java также имеет AtomicInteger и AtomicLong.

IMHO int обычно является лучшим выбором, чем Integer, и это изменчиво.

Можете ли вы подробнее рассказать о том, почему вам нужен объект с множеством элементов, возможно, есть другой способ добиться того же.

5 голосов
/ 14 августа 2016

AtomicInteger уже упоминалось.Изменяемые Double s можно эмулировать с помощью AtomicReference<Double>.Уже упомянутые предупреждения применяются, и это плохой стиль, но иногда у вас есть такой код

double sum=0
for (Data data:someListGenerator())
  sum+=data.getValue()

и вы хотите изменить его в функциональном стиле Java 8.Если код следует этому шаблону, но добавляет к нему значительную сложность, наиболее разумное преобразование может быть

AtomicReference<Double> sumref=new AtomicReference<>(0d);
someStreamGenerator().forEach(data->
  sumref.set(sumref.get().doubleValue()+data.getValue()));
double sum=sumref.get().doubleValue();

Конечно, это по крайней мере сомнительный стиль.Но я не раз оказывался в ситуации с витой петлей на ResultSet вычислениях и частично накапливая три разные данные из этого.Это действительно затрудняет преобразование кода в правильный функциональный стиль.Преобразование кумулятивных частей в соответствии с описанным выше шаблоном показалось мне разумным компромиссом между чистым кодом и упрощенным рефакторингом.

2 голосов
/ 07 января 2016

Вы можете импортировать пакет org.omg.CORBA (или просто нужный вам класс), и в нем вы можете использовать классы Holder.

Например, он имеет «IntHolder», где поле, гдеон хранит целое число как общедоступное, предоставляя доступ для его изменения.

public static void triple(IntHolder x){
    x.value = 3 * x.value;
}

IntHolder mutableInt = new IntHolder(10);
triple(mutableInt);     
System.out.println(mutableInt.value);

У него также есть "LongHolder" и "DoubleHolder" и множество других, которые вы можете использовать.Используйте с осторожностью.

Вот API для этого: https://docs.oracle.com/javase/7/docs/api/org/omg/CORBA/package-summary.html

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