我处于一种想要使用可变版本(例如Integer)的情况。我必须使用这些类(下面)还是Java内置一些东西?
http://www.java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm
我处于一种想要使用可变版本(例如Integer)的情况。我必须使用这些类(下面)还是Java内置一些东西?
http://www.java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm
n
可以消耗/添加热量的食物),最好使用使用后命名的类(例如class FoodItem { int calories; }
,因为这样更清晰,方法可以
int
无效,就好像它在一种方法中递增一样,那么该值将不会在另一种方法中反映出来。
Answers:
不,Java没有内置这些功能。这是有原因的。使用可变类型很危险,因为它们很容易被滥用。另外,实现它真的很容易。例如,commons-lang有一个MutableInt
。
您总是可以将值包装在数组中,就像int[] mutable = {1};
包含可变包装类的代码太麻烦一样。
这是我为可变整数创建的一个小类:
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;
}
}
您可以轻松地将此扩展到其他任何原语。当然,就像其他人说的那样,您应该谨慎使用它。
MutableInteger
,MutableDouble
,MutableString
等而是有Mutable<Integer>
,Mutable<Double>
,...(使用的内存开销Integer
超过int
通常不会落入帐户,但
您可以使用nnnn []作为任何原始类型的可变对象,如@Alexandre所建议的那样,java还具有AtomicInteger和AtomicLong。
IMHO int通常是比Integer更好的选择,并且是可变的。
您能否详细说明为什么需要一个多重对象,也许还有另一种方法可以实现相同的目的。
int
除非它也总是可变的final
Integer a = 4;
然后a = 5;
是有效代码,但Integer
不是可变的。
Integer
即使引用是实例也不可变,但这是另一种类型。
int
是不可变的,因为如果将其传递给方法,则该方法无法更改其值并使新值反映在调用方法中
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
计算循环中,并且部分地累积了三个不同的信息。这使得将代码转换为适当的功能样式真的很困难。在我看来,按照上述模式转换累计部分似乎是在干净代码和简化过的重构之间进行合理的权衡。
someStreamGenerator().mapToDouble(Data::getValue).sum()
。即使累积三个不同的信息,也可以使用或来实现功能。我认为没有理由将每个循环重构为一个功能代码片段,但是如果您要那样做,则应将其循环到最后。Stream.reduce
Stream.collect
for
并且foreach
可以是功能上经过重写的复杂框架的一部分,因此您必须以某种方式将其余代码对齐。
您可以导入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