簡體   English   中英

如何通過引用傳遞原始數據類型?

[英]How do I pass a primitive data type by reference?

如何在java中通過引用傳遞原始類型? 例如,如何將int傳遞給可修改的方法?

沒有辦法通過Java中的引用直接傳遞原語。

解決方法是將引用傳遞給包裝類的實例,然后將包含原語作為成員字段。 這樣的包裝類可以非常簡單地為自己編寫:

public class IntRef { public int value; }

但是一些預先構建的包裝類怎么樣,所以我們不必編寫自己的包裝類? 好:

Apache commons-lang Mutable *類:
優點 :單線程使用性能良好。 完整性。
缺點 :引入第三方庫依賴項。 沒有內置的並發控件。
代表類MutableBooleanMutableByteMutableDoubleMutableFloatMutableIntMutableLongMutableObjectMutableShort

java.util.concurrent.atomic Atomic *類:
優點 :標准Java(1.5+)API的一部分。 內置並發控件。
缺點 :在單線程設置中使用時性能損失很小。 缺少對某些數據類型的直接支持,例如沒有AtomicShort。
代表類AtomicBooleanAtomicIntegerAtomicLongAtomicReference
注意 :正如用戶ColinD 在他的回答中所示 ,AtomicReference可用於估計一些缺失的類,例如AtomicShort。

長度為1的原始數組
OscarRyz的答案演示了使用長度為1的數組來“包裝”原始值。
優點 :快速編寫。 高性能。 不需要第三方圖書館。
缺點 :有點臟。 沒有內置的並發控件。 代碼中沒有(明確地)自我文檔的結果:是方法簽名中的數組,所以我可以傳遞多個值? 或者它是否作為腳手架傳遞引用仿真?

另見
StackOverflow的答案問題“ Java中的可變布爾字段 ”。

我的看法
在Java中,您應該盡量少用或不用上述方法。 在C中,通常使用函數的返回值來中繼狀態代碼(SUCCESS / FAILURE),而函數的實際輸出通過一個或多個輸出參數進行中繼。 在Java中,最好使用Exceptions而不是返回代碼。 這釋放了用於攜帶實際方法輸出的方法返回值 - 大多數Java程序員發現的設計模式比out參數更自然。

java中沒有任何內容通過引用傳遞。 這一切都是通過價值傳遞的。

編輯:原語和對象類型都按值傳遞。 您永遠不能更改傳遞的值/引用,並期望原始值/引用發生更改。 例:

String a;
int b;

doSomething(a, b);

...

public void doSomething(String myA, int myB) {
   // whatever I do to "myA" and "myB" here will never ever ever change
   // the "a" and "b"
}

繞過這個障礙的唯一方法是傳遞容器對象,或者使用返回值,而不管它是原始的還是引用。

持有人:

private class MyStringHolder {
  String a;
  MyStringHolder(String a) {
    this.a = a;
  }
}

MyStringHolder holdA = new MyStringHolder("something");

public void doSomething(MyStringHolder holder) {
   // alter holder.a here and it changes.
}

具有返回值

int b = 42;
b = doSomething(b);

public int doSomething(int b) {
  return b + 1;
}

AtomicBoolean ,傳遞一個AtomicIntegerAtomicBoolean等。 每種原始類型都沒有,但如果需要,您可以使用AtomicReference<Short>

請注意:在Java中很少需要做這樣的事情。 當你想要這樣做的時候,我建議你重新考慮你想要做的事情,看看你是不是可以用其他方式去做(使用返回int的方法,比如說...究竟最好的是什么做的將因情況而異)。

這在Java中是不可能的,作為替代方案,您可以將其包裝在單個元素數組中。

void demo() { 
    int [] a = { 0 };
    increment ( a ) 
}
void increment( int [] v ) { 
     v[0]++;
}

但總有更好的選擇。

你不能。 但是您可以返回一個修改后的值的整數

int i = 0;
i = doSomething(i);

如果您傳遞的不止一個,您可能希望創建一個數據傳輸對象 (一個專門用於包含一組可以傳遞給類的變量的類)。

將具有該值的對象作為字段傳遞。

這在Java中是不可能的

一種選擇是使用像java.lang.Integer這樣的類,然后根本不傳遞基元。

另一方面,您可以使用以下代碼:

int a = 5;
a = func(a);

並讓func返回修改后的值。

暫無
暫無

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

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