如何通过引用传递原始数据类型?

时间:2010-11-30 22:51:36

标签: java pass-by-reference primitive-types

如何在java中通过引用传递基本类型?例如,如何将int传递给可修改的方法?

8 个答案:

答案 0 :(得分:73)

没有办法在Java中通过引用直接传递原语。

解决方法是将引用传递给包装类的实例,然后将包含原语作为成员字段。这样的包装类可以非常简单地为自己编写:

public class IntRef { public int value; }

但是一些预先构建的包装类怎么样,所以我们不必编写自己的包装类? OK:

Apache commons-lang Mutable *类:
优点:单线程使用的良好性能。完整性。
缺点:引入第三方库依赖项。没有内置的并发控件。
代表性课程MutableBooleanMutableByteMutableDoubleMutableFloatMutableIntMutableLong,{{3} },MutableObject

MutableShort原子*类:
优点:标准Java(1.5+)API的一部分。内置并发控制。
缺点:在单线程设置中使用时性能损失很小。缺少对某些数据类型的直接支持,例如没有AtomicShort。
代表类java.util.concurrent.atomicAtomicBooleanAtomicIntegerAtomicLong
注意:作为用户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)

改为通过AtomicIntegerAtomicBoolean等。每种原始类型都没有,但如果有必要,您可以使用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返回修改后的值。