假设我在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.您必须封装以实现所需的功能.Jon Skeet简要解释了为什么pass-by-reference被排除在Java之外.
好吧,有几个解决方法.你自己提到了一个.另一个是:
public void test(int[] values) { ++values[0]; ++values[1]; }
不过,我会选择自定义对象.这是一种更清洁的方式.此外,尝试重新排列您的问题,以便单个方法不需要返回两个值.