Имеет ли Java изменяемые типы для Integer, Float, Double, Long?
Я нахожусь в ситуации, когда я хочу использовать изменяемые версии таких вещей, как Integer. Должен ли я использовать эти классы (ниже) или Java имеет что-то встроенное?
http://www.java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm
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