Java是否具有Integer,Float,Double,Long的可变类型?

时间:2010-12-23 15:35:19

标签: java numbers integer mutable built-in

我处在一种情况,我想使用像Integer这样的可变版本。我是否必须使用这些类(下面)或者Java内置了什么?

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

7 个答案:

答案 0 :(得分:74)

如果包含可变包装类的代码太麻烦,你总是可以将值包装在像int[] mutable = {1};这样的数组中。

答案 1 :(得分:45)

不,Java没有这些内置。这是有原因的。使用可变类型很危险,因为它们很容易被滥用。此外,它实现起来非常简单。例如,commons-lang有一个MutableInt

答案 2 :(得分:39)

由于JDK 1.5 java现在有java.util.concurrent.atomic.AtomicInteger

这是一个线程安全的可变整数,使用示例:

final AtomicInteger value = new AtomicInteger(0);

然后在以后:

value.incrementAndGet();

答案 3 :(得分:8)

这是我为可变整数制作的一个小类:

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

您可以轻松地将其扩展到任何其他原语。当然,就像其他人一样,你应该小心使用它。

答案 4 :(得分:7)

你可以使用nnnn []作为任何原始类型的可变对象,如@Alexandre所暗示,java也有AtomicInteger和AtomicLong。

IMHO int通常是比Integer更好的选择,而且是可变的。

你能否详细了解为什么需要一个多重对象,也许还有另一种方法来实现同样的目标。

答案 5 :(得分:5)

AtomicInteger已被提及。可以使用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计算上的扭曲循环,并且部分累积了三个不同的信息。这使得将代码转换为适当的功能样式变得非常困难。根据上述模式转换累积部分在我看来是干净的代码和过度简化的重构之间的合理权衡。

答案 6 :(得分:2)

您可以导入org.omg.CORBA包(或只是您需要的类),在其中您可以使用Holder类。

例如,它有“IntHolder”,其中存储整数的字段是public,允许修改它。

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