我处于一种我想使用诸如 Integer 之类的可变版本的情况。我必须使用这些类(如下)还是 Java 有内置的东西?
http://www.java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm
int[] mutable = {1};
如果包含可变包装类的代码太麻烦,您总是可以将值包装在一个数组中。
由于 JDK 1.5 java 现在有java.util.concurrent.atomic.AtomicInteger
这是一个线程安全的可变整数,使用示例:
final AtomicInteger value = new AtomicInteger(0);
然后稍后:
value.incrementAndGet();
不,Java 没有这些内置功能。这是有原因的。使用可变类型是危险的,因为它们很容易被滥用。此外,它很容易实现。例如,commons-lang 有一个MutableInt
.
这是我为可变整数制作的一个小类:
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;
}
}
您可以轻松地将其扩展到任何其他原语。当然,就像其他人所说的那样,您应该谨慎使用它。
正如@Alexandre 建议的那样,您可以将 nnnn[] 用作任何原始类型的可变对象,java 也有 AtomicInteger 和 AtomicLong。
恕我直言 int 通常是比 Integer 更好的选择,而且它是可变的。
您能否详细说明为什么需要多个对象,也许还有另一种方法可以实现相同的目标。
AtomicInteger
已经提到过。MutableDouble
可以用 来模拟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