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
一方のメソッドでインクリメントされたかのようには機能せず、値はもう一方のメソッドに反映されません。
回答:
いいえ、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;
}
}
これを他のプリミティブに簡単に拡張できます。もちろん、他のみんなが言っているように、あなたはそれを注意深く使うべきです。
MutableInteger
、MutableDouble
、MutableString
などではなく、持っているMutable<Integer>
、Mutable<Double>
、...使用のメモリオーバーヘッド(Integer
オーバーはint
通常考慮に落ちることはありません。しかし、あなたは(あなたがあなたの整数かかわらず、あなたはまだサブクラスに必要に匹敵または類似のものになりたい場合は)ほとんどのケースを扱うことができるクラスを使用する準備ができて、単一の取得。
@Alexandreが示唆するように、nnnn []を任意のプリミティブ型の可変オブジェクトとして使用できます。Javaには、AtomicIntegerとAtomicLongもあります。
IMHO intは通常、整数よりも適切な選択であり、変更可能です。
複数のオブジェクトが必要な理由の詳細を教えてください。おそらく、同じことを実現する別の方法があります。
int
それ以外の場合は常に変更可能ですfinal
Integer a = 4;
、a = 5;
は有効なコードですが、Integer
変更することはできません。
Integer
インスタンスへの参照が変更可能であっても、インスタンスは変更可能ではないことに同意しますが、それは別のタイプです。
int
メソッドに渡すと、メソッドがその値を変更して、呼び出し元のメソッドに新しい値を反映させる方法がないため、は変更できません
AtomicInteger
すでに言及されています。可変Double
はでエミュレートできますAtomicReference<Double>
。すでに述べた警告が適用され、それは悪いスタイルですが、時々あなたはこのようなコードを持っています
double sum=0
for (Data data:someListGenerator())
sum+=data.getValue()
関数型Java8スタイルでリファクタリングしたい。コードがこのパターンに従っているが、かなり複雑になっている場合、最も賢明な変換は次のようになります。
AtomicReference<Double> sumref=new AtomicReference<>(0d);
someStreamGenerator().forEach(data->
sumref.set(sumref.get().doubleValue()+data.getValue()));
double sum=sumref.get().doubleValue();
もちろん、これは少なくとも疑わしいスタイルです。しかし、私は、ResultSet
コンピューティング上でねじれたループがあり、そこから3つの異なる情報を部分的に蓄積している状況に何度も気づきました。これにより、コードを適切な機能スタイルに変換することが非常に困難になります。上記のパターンに従って累積パーツを変換することは、クリーンなコードと過度に単純化されたリファクタリングの間の合理的なトレードオフのように思えました。
someStreamGenerator().mapToDouble(Data::getValue).sum()
。3つの異なる情報を累積する場合でも、またはを使用する機能的な方法があります。すべてのループを関数型コードフラグメントにリファクタリングする理由はわかりませんが、そのようにしたい場合は、最後まで実行する必要があります。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