当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在Java中使用等效的C++引用参数?》经验,为你挑选了4个好方法。

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

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

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



1> OscarRyz..:

使用包装器模拟引用.

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

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



2> JaredPar..:

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

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



3> jason..:

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



4> Bombe..:

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

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

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

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有