C#的ref和Java用的

Tar*_*rik 10 java pass-by-reference

我们知道在将参数传递给方法时,两种语言都是按值传递的.但C#支持refout关键字传递原始类型的引用.我在Java中寻找相同的关键字和技术?

我的猜测是使用Integer包装类而不是intJava来传入.

有什么建议和例子吗?

WRe*_*ach 12

你的猜测是正确的.需要一个包装器(但不是Integer,因为它是不可变的).

有些人为此目的使用单个元素数组:

int[] x = { 0 };
int[] y = { 0 };
someMethod(x, y);
return x[0] + y[0];
Run Code Online (Sandbox Code Playgroud)

很多人会用GOTO对那种技术进行排名.

有些人定义了一个通用的持有者类:

public class Holder<T> {
    private T _value;
    private Holder(T value) { _value = value; }
    public static of(T value) { return new Holder<T>(value); }
    public T getValue() { return _value; }
    public void setValue(T value) { _value = value; }
}

...

Holder<String> x = Holder.of("123");
Holder<String> y = Holder.of("456");
someMethod(x, y);
return x.getValue() + y.getValue();
Run Code Online (Sandbox Code Playgroud)

有些人定义了一个专用的类型:

SomeMethodResult result = someMethod(x, y);
return result.getX() + result.getY();
Run Code Online (Sandbox Code Playgroud)

有些人会安排在方法内完成工作,首先避免使用引用参数:

return someMethod(x, y);
Run Code Online (Sandbox Code Playgroud)

这些技术中的每一种都有优点和缺点:

  • 数组:简单与丑陋,依赖于只有一个元素的数组
  • 持有人:安全与详细,拳击
  • 专用类型:安全与详细,可能过度杀伤
  • 改变方法:安全,清洁与不总是可能

就个人而言,我认为Java搞砸了这个.我宁愿避免使用引用参数,但我希望Java允许来自方法的多个返回值.但是,说实话,我不经常绊倒这个.我不会为这个功能提供肾脏.:)


SLa*_*aks 5

Java不支持此功能.