web-dev-qa-db-ja.com

Java Integer、Float、Double、Longの可変タイプはありますか?

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

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

68

いいえ、Javaにはこれらが組み込まれていません。そして、それは理由です。可変タイプを使用すると、簡単に誤用される可能性があるため、危険です。たとえば、commons-langには MutableInt があります。

46
Bozho

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

77
Alex Jasmin

JDK 1.5 JavaにはJava.util.concurrent.atomic.AtomicInteger

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

final AtomicInteger value = new AtomicInteger(0);

その後:

value.incrementAndGet();
40
Clive

可変整数用に作成した小さなクラスを次に示します。

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;
    }
}

これを他のプリミティブに簡単に拡張できます。もちろん、他の人が言っているように、慎重に使用する必要があります。

8
VinceFior

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

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

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

7
Peter Lawrey

AtomicIntegerはすでに言及されています。可変のDoublesは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つの異なる情報を部分的に蓄積している状況で、複数回自分自身を見つけました。これにより、コードを適切な機能スタイルに変換することが非常に難しくなります。上記のパターンに従って累積部分を変換することは、きれいなコードと単純化されたリファクタリングの間の合理的なトレードオフのように思えました。

5
Dirk Hillbrecht

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

2
Erkan Uretener