如何在Java中使用等效的C ++引用参数?

假设我在C ++中有这个:

void test(int &i, int &j) { ++i; ++j; } 

在函数内部更改值,然后在外部使用。 我怎么能写一个在Java中做同样的代码? 我想我可以返回一个封装两个值的类,但这看起来真的很麻烦。

使用包装器模拟引用。

以某种方式模拟这种行为的一种方法是创建一个通用的包装器。

 public class _ { E ref; public _( E e ){ ref = e; } public E g() { return ref; } public void s( E e ){ this.ref = e; } public String toString() { return ref.toString(); } } 

我不太相信这段代码的价值,我无法帮助它,我不得不编码:)

所以在这里。

样本用法:

 public class Test { public static void main ( String [] args ) { _ iByRef = new _( 1 ); addOne( iByRef ); System.out.println( iByRef ); // prints 2 _ sByRef = new _( "Hola" ); reverse( sByRef ); System.out.println( sByRef ); // prints aloH } // Change the value of ref by adding 1 public static void addOne( _ ref ) { int i = ref.g(); ref.s( ++i ); // or //int i = ref.g(); //ref.s( i + 1 ); } // Reverse the vale of a string. public static void reverse( _ otherRef ) { String v = otherRef.g(); String reversed = new StringBuilder( v ).reverse().toString(); otherRef.s( reversed ); } } 

这里有趣的是,通用包装类名是“_”,它是一个有效的类标识符。 声明如下:

对于整数:

 _ iByRef = new _( 1 ); 

对于字符串:

 _ sByRef = new _( "Hola" ); 

对于任何其他类

 _ employee = new _( Employee.byId(123) ); 

方法“s”和“g”代表set和get:P

Java没有相当于C ++的引用。 使其工作的唯一方法是将值封装在另一个类中并交换类中的值。

以下是对该问题的冗长讨论: http : //www.yoda.arachsys.com/java/passing.html

Java没有pass-by-reference。 您必须封装以实现所需的function。 Jon Skeet简要解释了为什么pass-by-reference被排除在Java之外。

好吧,有几个解决方法。 你自己提到了一个。 另一个是:

 public void test(int[] values) { ++values[0]; ++values[1]; } 

不过,我会选择自定义对象。 这是一种更清洁的方式。 此外,尝试重新排列您的问题,以便单个方法不需要返回两个值。

一个更好的问题:为什么要创建具有这种副作用的方法?

通常,这是一个强烈的迹象,表明您应该将数据提取到一个单独的类中,使用公共访问器来描述操作发生的原因。

你必须以某种方式装箱(你的方式)。

整数是不可变的。 好无用 int是可变的但是因为java是按值传递的,所以在那种情况下它再次无法使用。 有关更多解释,请参阅这些页面: Java是按值传递,该死! 和int vs Integer

Apache commons lang有一个MutableInt类。 或者你可以自己写。

在任何情况下,它都不应该那么糟糕,因为它不应该经常发生。 如果确实如此,那么您应该明确地改变您在Java中编码的方式。

两个整数是否相关? 像一对x / y坐标? 如果是这样,我会将整数放在一个新类中,并将该类传递给该方法。

 class A{ public void test(Coord c) { c.x++; c.y++; } private class Coord{ public int x, y; } } 

如果两个整数不相关,您可能想要考虑为什么首先将它们传递给相同的方法。

最简单的解决方案是使用org.apache.commons.lang.mutable.MutableInt类,您不需要自己编写。

Java按值传递参数,并且没有允许传递引用的机制。

虽然它是一个糟糕的设计模式IMHO,另一种可能的解决方案是

 static void test(AtomicInteger i, AtomicInteger j) { i.incrementAndGet(); j.incrementAndGet(); } 

你可以构造盒装对象,即

 Integer iObj = new Integer(i); Integer jObj = new Integer(j); 

写下你的日常生活

 public void test(Integer i, Integer j){ i = i.add(1); j = j.add(1); } 

由于种种原因,Java的设计者觉得按值调用更好; 他们有目的地没有包括一个通过引用调用的方法。 (严格地说,它们传递对象的引用副本,具有原始类型的特殊情况,它们纯粹按值调用。但效果是相同的。)