如何通过引用传递基元数据types?
我怎样才能在java中通过引用传递一个原始types? 例如,我如何让一个int
传递给一个可修改的方法?
在Java中没有直接通过引用传递原语的方法。
解决方法是将引用传递给包装类的实例,然后包含作为成员字段的原语。 这样的包装类可以是非常简单的自己写:
public class IntRef { public int value; }
但是,如何预先构build的包装类,所以我们不必写我们自己的? 好:
Apache commons-lang Mutable *类:
优点 :单线程使用性能良好。 完整性。
缺点 :引入第三方库依赖项。 没有内置的并发控制。
代表类 : MutableBoolean , MutableByte , MutableDouble , MutableFloat , MutableInt , MutableLong , MutableObject , MutableShort 。
java.util.concurrent.atomic Atomic *类:
优点 :标准Java(1.5+)API的一部分。 内置的并发控制。
缺点 :在单线程设置中使用时性能不佳。 缺less对某些数据types的直接支持,例如没有AtomicShort。
代表类 : AtomicBoolean , AtomicInteger , AtomicLong和AtomicReference 。
注意 :当用户ColinD 在他的答案中显示时 ,可以使用AtomicReference来近似一些缺失的类,例如AtomicShort。
长度为1的基本数组
OscarRyz的答案演示了使用长度为1的数组来“包装”一个原始值。
优点 :快速写入。 高性能。 没有第三方图书馆的必要。
缺点 :有点脏。 没有内置的并发控制。 结果在代码中(不清楚)自我文档:方法签名中的数组,所以我可以传递多个值? 还是在这里作为通过引用仿真的脚手架?
另见
StackOverflow问题的答案“ Java中的可变布尔字段 ”。
我的想法
在Java中,你应该尽量less用或不用。 在C中,通常使用函数的返回值来中继状态码(SUCCESS / FAILURE),而函数的实际输出则通过一个或多个输出参数中继。 在Java中,最好使用exception而不是返回码。 这就释放了方法返回值,用于实现方法输出 – 大多数Java程序员发现的devise模式比输出参数更自然。
java中没有任何内容被引用传递。 这一切都是有价值的。
编辑:基元和对象types都是按值传递的。 你永远不能改变传递的值/引用,并期望原始值/引用改变。 例:
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" }
绕过这个障碍的唯一方法是传递一个容器对象,或者使用返回值,而不pipe它是基元还是引用。
持有者:
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; }
请传递AtomicInteger
, AtomicBoolean
等。 每种原始types都没有,但是如果需要的话,也可以使用AtomicReference<Short>
。
请注意:Java中很less有这样的需求。 当你想这样做的时候,我build议重新考虑你想要做什么,看看你是否不能以其他方式去做(使用返回一个int
的方法,比如说…什么是最好的做的是会因情况而异)。
这在Java中是不可能的,作为替代scheme,您可以将其包装在单个元素数组中。
void demo() { int [] a = { 0 }; increment ( a ) } void increment( int [] v ) { v[0]++; }
但总是有更好的select。
你不能。 但是你可以返回一个修改后的整数值
int i = 0; i = doSomething(i);
如果您传入了多个数据,您可能希望创build一个数据传输对象 (一个专门包含一组可以传递给类的variables的类)。
将具有该值的对象作为字段传递。
这在Java中是不可能的
一种select是使用java.lang.Integer这样的类,那么你根本就不传递一个原语。
另一方面,你可以使用如下代码:
int a = 5; a = func(a);
并有func返回修改后的值。