Я в ситуации, когда хочу использовать изменяемые версии таких вещей, как Integer. Должен ли я использовать эти классы (см. Ниже) или есть что-то встроенное в Java?
http://www.java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm
Я в ситуации, когда хочу использовать изменяемые версии таких вещей, как Integer. Должен ли я использовать эти классы (см. Ниже) или есть что-то встроенное в Java?
http://www.java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm
Нет, у Java нет этих встроенных. И это по какой-то причине. Использование изменчивых типов опасно, поскольку их можно легко использовать неправильно. Кроме того, его действительно легко реализовать. Например, commons-lang имеет MutableInt
.
Вы всегда можете перенести значение в массив, например int[] mutable = {1};
, если включить код для изменяемого класса-оболочки слишком громоздко.
Так как JDK 1.5 java теперь имеет java.util.concurrent.atomic.AtomicInteger
Это переменное целое число, пример использования:
public void incrementInt(AtomicInteger value) {
value.set(value.intValue()+1);
}
Вы можете использовать nnnn [] в качестве изменяемого объекта для любого примитивного типа, как предлагает @Alexandre, у java также есть AtomicInteger и AtomicLong.
IMHO int обычно является лучшим выбором, чем Integer, и это изменяет.
Можете ли вы получить более подробную информацию о том, почему вам нужен объект mutliple, возможно, есть еще один способ добиться того же.
Вот небольшой класс, который я сделал для изменяемого целого числа:
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;
}
}
Вы можете легко распространить это на любой другой примитив. Конечно, как и все остальные, вы должны внимательно его использовать.
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
и частично кумуляцией трех разных данных. Это затрудняет преобразование кода в правильный функциональный стиль. Преобразование кумулятивных частей в соответствии с приведенным выше образцом показалось мне разумным компромиссом между чистым кодом и упрощенным рефакторингом.
Вы можете импортировать пакет 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