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

新手上路,请多包涵

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

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

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

原文由 al bundy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 568
1 个回答

使用包装器模拟引用。

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

 public class _<E> {
    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 ) {
        _<Integer> iByRef = new _<Integer>( 1 );
        addOne( iByRef );
        System.out.println( iByRef ); // prints 2

        _<String> sByRef = new _<String>( "Hola" );
        reverse( sByRef );
        System.out.println( sByRef ); // prints aloH

    }

    // Change the value of ref by adding 1
    public static void addOne( _<Integer> 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( _<String> otherRef ) {
        String v = otherRef.g();
        String reversed = new StringBuilder( v ).reverse().toString();
        otherRef.s( reversed );
    }

}

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

对于整数:

 _<Integer> iByRef = new _<Integer>( 1 );

对于字符串:

 _<String> sByRef = new _<String>( "Hola" );

对于任何其他班级

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

方法“s”和“g”代表设置和获取:P

原文由 OscarRyz 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题