如何在java中通过引用传递基本类型?例如,如何将int
传递给可修改的方法?
答案 0 :(得分:73)
没有办法在Java中通过引用直接传递原语。
解决方法是将引用传递给包装类的实例,然后将包含原语作为成员字段。这样的包装类可以非常简单地为自己编写:
public class IntRef { public int value; }
但是一些预先构建的包装类怎么样,所以我们不必编写自己的包装类? OK:
Apache commons-lang Mutable *类:
优点:单线程使用的良好性能。完整性。
缺点:引入第三方库依赖项。没有内置的并发控件。
代表性课程:MutableBoolean,MutableByte,MutableDouble,MutableFloat,MutableInt,MutableLong,{{3} },MutableObject。
MutableShort原子*类:
优点:标准Java(1.5+)API的一部分。内置并发控制。
缺点:在单线程设置中使用时性能损失很小。缺少对某些数据类型的直接支持,例如没有AtomicShort。
代表类:java.util.concurrent.atomic,AtomicBoolean,AtomicInteger和AtomicLong。
注意:作为用户ColinD AtomicReference,AtomicReference可用于近似某些缺失的类,例如AtomicShort。
长度1原始数组
shows in his answer演示使用长度为1的数组来“包装”原始值。
优点:快速编写。高性能。不需要第三方图书馆。
缺点:有点脏。没有内置的并发控件。代码中没有(明确地)自我文档的结果:是方法签名中的数组,所以我可以传递多个值?或者它是否作为引用仿制的脚手架?
另见
StackOverflow问题“OscarRyz's answer”的答案。
我的意见
在Java中,您应该尽量少用或不用上述方法。在C中,通常使用函数的返回值来中继状态代码(SUCCESS / FAILURE),而函数的实际输出通过一个或多个输出参数进行中继。在Java中,最好使用Exceptions而不是返回代码。这释放了用于携带实际方法输出的方法返回值 - 大多数Java程序员发现的设计模式比out参数更自然。
答案 1 :(得分:13)
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;
}
答案 2 :(得分:13)
改为通过AtomicInteger
,AtomicBoolean
等。每种原始类型都没有,但如果有必要,您可以使用AtomicReference<Short>
。
请注意:在Java中很少需要做这样的事情。当你想要这样做的时候,我建议你重新考虑你想要做的事情,看看你是否能够以其他方式做到这一点(使用返回int
的方法,比如...究竟是什么最好的办法是因情况而异。)
答案 3 :(得分:10)
这在Java中是不可能的,作为替代方案,您可以将其包装在单个元素数组中。
void demo() {
int [] a = { 0 };
increment ( a )
}
void increment( int [] v ) {
v[0]++;
}
但总会有更好的选择。
答案 4 :(得分:3)
你做不到。但是你可以返回一个修改后的整数值
int i = 0;
i = doSomething(i);
如果你传递的不止一个,你可能希望创建一个Data Transfer Object(一个专门用于包含一组可以传递给类的变量的类)。
答案 5 :(得分:2)
将具有该值的对象作为字段传递。
答案 6 :(得分:1)
这在Java中是不可能的
答案 7 :(得分:-2)
一个选项是使用像java.lang.Integer这样的类,然后根本不传递基元。
另一方面,您可以使用以下代码:
int a = 5;
a = func(a);
并让func返回修改后的值。