Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

public void incrementInt(AtomicInteger value) {
    value.set(value.intValue()+1);
}

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

Вы можете импортировать пакет 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