Integer などの変更可能なバージョンを使用したい状況にあります。これらのクラス (以下) を使用する必要がありますか、それとも Java には何かが組み込まれていますか?
http://www.java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm
int[] mutable = {1};
変更可能なラッパー クラスのコードを含めるのが面倒な場合のように、常に値を配列にラップできます。
JDK 1.5以降、javaにはjava.util.concurrent.atomic.AtomicInteger
これはスレッドセーフな可変整数であり、使用例は次のとおりです。
final AtomicInteger value = new AtomicInteger(0);
その後:
value.incrementAndGet();
いいえ、Java にはこれらが組み込まれていません。それには理由があります。可変型の使用は、誤用されやすいため危険です。さらに、それを実装するのは本当に簡単です。たとえば、commons-lang にはMutableInt
.
@Alexandreが示唆するように、nnnn[]を任意のプリミティブ型の可変オブジェクトとして使用できます。JavaにはAtomicIntegerとAtomicLongもあります。
IMHO int は通常、Integer よりも優れた選択であり、変更可能です。
複数のオブジェクトが必要な理由の詳細を教えてください。おそらく、同じことを達成する別の方法があります。
AtomicInteger
すでに言及されています。MutableDouble
は でエミュレートできます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
そこから 3 つの異なる情報が部分的に蓄積されている状況に何度も遭遇しました。これにより、コードを適切な機能スタイルに変換することが非常に困難になります。上記のパターンに従って累積部分を変換することは、きれいなコードと過度に単純化されたリファクタリングとの間の合理的なトレードオフのように思えました。
org.omg.CORBA パッケージ (または必要なクラスのみ) をインポートでき、その中でホルダー クラスを使用できます。
たとえば、整数を格納するフィールドが公開されている「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