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

Does Java have mutable types for Integer, Float, Double, Long?

提问人:smuggledPancakes 提问时间:12/23/2010 更新时间:1/12/2018 访问量:72093

问:

我处于想要使用像 Integer 这样的东西的可变版本的情况。我是否必须使用这些类(如下),或者 Java 是否内置了某些内容?

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

爪哇岛 数字 整数 可变 内置

评论

9赞 helpermethod 12/23/2010
问题是你为什么要这样做?

答:

111赞 Alex Jasmin 12/23/2010 #1

您始终可以将值包装在数组中,例如,如果包含可变包装类的代码太麻烦。int[] mutable = {1};

66赞 Bozho 12/23/2010 #2

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

6赞 Peter Lawrey 12/23/2010 #3

您可以按照@Alexandre建议将 nnnn[] 用作任何基元类型的可变对象,java 也有 AtomicInteger 和 AtomicLong。

恕我直言,int 通常是比 Integer 更好的选择,而且它是可变的。

你能更详细地解释为什么你需要一个多对象吗,也许还有另一种方法可以实现同样的事情。

62赞 Clive 8/13/2012 #4

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

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

final AtomicInteger value = new AtomicInteger(0);

然后稍后:

value.incrementAndGet();
13赞 VinceFior 7/31/2014 #5

这是我为可变整数创建的一个小类:

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

您可以轻松地将其扩展到任何其他基元。当然,就像其他人所说的那样,您应该谨慎使用它。

3赞 Erkan Uretener 1/7/2016 #6

您可以导入 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

6赞 Dirk Hillbrecht 8/14/2016 #7

AtomicInteger已经提到过了。可变的 s 可以用 来模拟。已经提到的警告适用,这是糟糕的风格,但有时你有这样的代码DoubleAtomicReference<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