93

Integer などの変更可能なバージョンを使用したい状況にあります。これらのクラス (以下) を使用する必要がありますか、それとも Java には何かが組み込まれていますか?

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

4

7 に答える 7

101

int[] mutable = {1};変更可能なラッパー クラスのコードを含めるのが面倒な場合のように、常に値を配列にラップできます。

于 2010-12-23T15:38:29.920 に答える
60

JDK 1.5以降、javaにはjava.util.concurrent.atomic.AtomicInteger

これはスレッドセーフな可変整数であり、使用例は次のとおりです。

final AtomicInteger value = new AtomicInteger(0);

その後:

value.incrementAndGet();
于 2012-08-13T01:01:08.403 に答える
57

いいえ、Java にはこれらが組み込まれていません。それには理由があります。可変型の使用は、誤用されやすいため危険です。さらに、それを実装するのは本当に簡単です。たとえば、commons-lang にはMutableInt.

于 2010-12-23T15:39:02.440 に答える
7

@Alexandreが示唆するように、nnnn[]を任意のプリミティブ型の可変オブジェクトとして使用できます。JavaにはAtomicIntegerとAtomicLongもあります。

IMHO int は通常、Integer よりも優れた選択であり、変更可能です。

複数のオブジェクトが必要な理由の詳細を教えてください。おそらく、同じことを達成する別の方法があります。

于 2010-12-23T15:47:29.777 に答える
6

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 つの異なる情報が部分的に蓄積されている状況に何度も遭遇しました。これにより、コードを適切な機能スタイルに変換することが非常に困難になります。上記のパターンに従って累積部分を変換することは、きれいなコードと過度に単純化されたリファクタリングとの間の合理的なトレードオフのように思えました。

于 2016-08-14T10:08:32.047 に答える
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

于 2016-01-07T05:21:59.590 に答える