[英]How do I pass a primitive data type by reference?
如何在java中通過引用傳遞原始類型? 例如,如何將int
傳遞給可修改的方法?
沒有辦法通過Java中的引用直接傳遞原語。
解決方法是將引用傳遞給包裝類的實例,然后將包含原語作為成員字段。 這樣的包裝類可以非常簡單地為自己編寫:
public class IntRef { public int value; }
但是一些預先構建的包裝類怎么樣,所以我們不必編寫自己的包裝類? 好:
Apache commons-lang Mutable *類:
優點 :單線程使用性能良好。 完整性。
缺點 :引入第三方庫依賴項。 沒有內置的並發控件。
代表類 : MutableBoolean , MutableByte , MutableDouble , MutableFloat , MutableInt , MutableLong , MutableObject , MutableShort 。
java.util.concurrent.atomic Atomic *類:
優點 :標准Java(1.5+)API的一部分。 內置並發控件。
缺點 :在單線程設置中使用時性能損失很小。 缺少對某些數據類型的直接支持,例如沒有AtomicShort。
代表類 : AtomicBoolean , AtomicInteger , AtomicLong和AtomicReference 。
注意 :正如用戶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
,傳遞一個AtomicInteger
, AtomicBoolean
等。 每種原始類型都沒有,但如果需要,您可以使用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.