smu*_*kes 70 java integer numbers mutable built-in
我处在一种情况,我想使用像Integer这样的可变版本.我是否必须使用这些类(下面)或者Java内置了什么?
http://www.java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm
Ale*_*min 81
您可以始终将值包装在数组中,就像int[] mutable = {1};
包含可变包装类的代码太麻烦一样.
Boz*_*zho 49
不,Java没有这些内置.这是有原因的.使用可变类型很危险,因为它们很容易被滥用.此外,它实现起来非常简单.例如,commons-lang有一个MutableInt
.
小智 41
既然JDK 1.5 java现在有了 java.util.concurrent.atomic.AtomicInteger
这是一个线程安全的可变整数,使用示例:
final AtomicInteger value = new AtomicInteger(0);
Run Code Online (Sandbox Code Playgroud)
然后是:
value.incrementAndGet();
Run Code Online (Sandbox Code Playgroud)
这是我为可变整数制作的一个小类:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以轻松地将其扩展到任何其他原语.当然,就像其他人一样,你应该小心使用它.
你可以使用nnnn []作为任何原始类型的可变对象,如@Alexandre所暗示,java也有AtomicInteger和AtomicLong.
恕我直言通常是一个比整数更好的选择,这是可变的.
你能否详细了解为什么需要一个mutliple对象,也许还有另一种方法来实现同样的东西.
AtomicInteger
已被提及.Double
可以模拟可变的s AtomicReference<Double>
.已经提到的警告适用,它是不好的风格,但有时你有这样的代码
double sum=0
for (Data data:someListGenerator())
sum+=data.getValue()
Run Code Online (Sandbox Code Playgroud)
并希望以功能Java 8风格重构它.如果代码遵循此模式但增加了相当大的复杂性,则最明智的转换可能是
AtomicReference<Double> sumref=new AtomicReference<>(0d);
someStreamGenerator().forEach(data->
sumref.set(sumref.get().doubleValue()+data.getValue()));
double sum=sumref.get().doubleValue();
Run Code Online (Sandbox Code Playgroud)
当然,这至少是一种可疑的风格.但是,我发现自己不止一次出现在ResultSet
计算机上扭曲循环的情况,并且部分累积了三种不同的信息.这使得将代码转换为适当的功能样式变得非常困难.根据上述模式转换累积部分在我看来是干净的代码和过度简化的重构之间的合理权衡.