簡體   English   中英

Java是否具有Integer,Float,Double,Long的可變類型?

[英]Does Java have mutable types for Integer, Float, Double, Long?

我處在一種情況,我想使用像Integer這樣的可變版本。 我是否必須使用這些類(下面)或者Java內置了什么?

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

你總是可以將值包裝在一個數組中,如int[] mutable = {1}; 如果包含可變包裝類的代碼太麻煩了。

不,Java沒有這些內置。這是有原因的。 使用可變類型很危險,因為它們很容易被濫用。 此外,它實現起來非常簡單。 例如,commons-lang有一個MutableInt

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

您可以輕松地將其擴展到任何其他原語。 當然,就像其他人一樣,你應該小心使用它。

你可以使用nnnn []作為任何原始類型的可變對象,如@Alexandre所暗示,java也有AtomicInteger和AtomicLong。

恕我直言通常是一個比整數更好的選擇,這是可變的。

你能否詳細了解為什么需要一個mutliple對象,也許還有另一種方法來實現同樣的東西。

AtomicInteger已被提及。 可以使用AtomicReference<Double>模擬Mutable 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計算中扭曲循環並且部分累積三種不同信息的情況。 這使得將代碼轉換為適當的功能樣式變得非常困難。 根據上述模式轉換累積部分在我看來是干凈的代碼和過度簡化的重構之間的合理權衡。

您可以導入org.omg.CORBA包(或只是您需要的類),在其中您可以使用Holder類。

例如,它具有“IntHolder”,其中存儲整數的字段是public,提供修改它的訪問權限。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM