私は、Integerなどの可変バージョンを使用したい状況にあります。これらのクラスを使用する必要がありますか(下)またはJavaに何かが組み込まれていますか?
http://www.Java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm
いいえ、Javaにはこれらが組み込まれていません。そして、それは理由です。可変タイプを使用すると、簡単に誤用される可能性があるため、危険です。たとえば、commons-langには MutableInt
があります。
可変ラッパークラスのコードを含めることが面倒すぎる場合は、int[] mutable = {1};
などの配列で値を常にラップできます。
JDK 1.5 JavaにはJava.util.concurrent.atomic.AtomicInteger
これはスレッドセーフな可変整数で、使用例は次のとおりです。
final AtomicInteger value = new AtomicInteger(0);
その後:
value.incrementAndGet();
可変整数用に作成した小さなクラスを次に示します。
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;
}
}
これを他のプリミティブに簡単に拡張できます。もちろん、他の人が言っているように、慎重に使用する必要があります。
@Alexandreが示唆するように、nnnn []を任意のプリミティブ型の可変オブジェクトとして使用できます。JavaにはAtomicIntegerとAtomicLongもあります。
通常、IMHO intはIntegerよりも良い選択であり、変更可能です。
複数のオブジェクトが必要な理由の詳細を教えてください。おそらく同じことを達成する別の方法があります。
AtomicInteger
はすでに言及されています。可変のDouble
sはAtomicReference<Double>
でエミュレートできます。既に述べた警告が適用され、スタイルが悪いですが、時々このようなコードがあります
double sum=0
for (Data data:someListGenerator())
sum+=data.getValue()
機能的なJava 8スタイルでリファクタリングします。コードがこのパターンに従うが、かなり複雑になる場合は、最も賢明な変換could
AtomicReference<Double> sumref=new AtomicReference<>(0d);
someStreamGenerator().forEach(data->
sumref.set(sumref.get().doubleValue()+data.getValue()));
double sum=sumref.get().doubleValue();
もちろん、これは少なくとも疑わしいスタイルです。しかし、私はResultSet
コンピューティングにねじれたループがあり、そこから3つの異なる情報を部分的に蓄積している状況で、複数回自分自身を見つけました。これにより、コードを適切な機能スタイルに変換することが非常に難しくなります。上記のパターンに従って累積部分を変換することは、きれいなコードと単純化されたリファクタリングの間の合理的なトレードオフのように思えました。
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