Имеет ли Java изменяемые типы для Integer, Float, Double, Long?


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

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

7 61

7 ответов:

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

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

Так как JDK 1.5 java теперь имеет java.util.concurrent.atomic.AtomicInteger

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

final AtomicInteger value = new AtomicInteger(0);
позже:
value.incrementAndGet();

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

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;
    }
}

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

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

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

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

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 вычисление и частично кумулирование трех различных сведений из него. Это делает его действительно трудно преобразовать код в надлежащий функциональный стиль. Преобразование кумулирующих частей в соответствии с приведенным выше шаблоном казалось мне разумным компромиссом между чистым кодом и упрощенным рефакторингом.

можно импортировать орг.о мой бог.Пакет CORBA (или просто класс, который вам нужен), и в нем вы можете использовать классы держателя.

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