Java对Integer,Float,Double,Long有可变types吗?

我处于一种我想要使用像Integer这样的可变版本的情况。 我必须使用这些类(下面)还是Java有内置的东西?

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

不,Java没有这些内置的。这是一个原因。 使用可变types是很危险的,因为它们很容易被滥用。 另外,实现它真的很容易。 例如,commons-lang有一个MutableInt

你总是可以把值包装成int[] mutable = {1}; 如果包含可变包装类的代码太麻烦。

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

这是一个可变整数,使用示例:

 public void incrementInt(AtomicInteger value) { value.set(value.intValue()+1); } 

您可以使用nnnn []作为任何基本types的可变对象,如@Alexandre所示,java也有AtomicInteger和AtomicLong。

恕我直言,INT通常是比整数更好的select,这是可变的。

你能详细介绍为什么你需要一个多重对象,也许还有另一种方法来实现同样的事情。

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

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

你可以很容易地把它扩展到任何其他的基元。 当然,像其他人一样,你应该小心使用它。

AtomicInteger已经被提及。 可变的Double可以用AtomicReference<Double>来模拟。 已经提到的警告适用,这是不好的风格,但有时你有这样的代码

 double sum=0 for (Data data:someListGenerator()) sum+=data.getValue() 

并希望用function性的Java 8风格来重构它。 如果代码遵循这种模式,但增加了相当复杂的,最明智的转换可能

 AtomicReference<Double> sumref=new AtomicReference<>(0d); someStreamGenerator().forEach(data-> sumref.set(sumref.get().doubleValue()+data.getValue())); double sum=sumref.get().doubleValue(); 

当然,这至less是有问题的风格。 但是我发现自己不止一次处于ResultSet计算的一个扭曲循环,部分累积了三个不同的信息。 这使得很难将代码转换成适当的function风格。 根据上述模式转换累积部分似乎是在干净的代码和过于简单的重构之间的合理折衷。

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