在Java中将原始类型作为out param传递

Cin*_*Joe 6 java parameters pass-by-reference

我需要返回/更新布尔值,同时从方法返回一个东西列表.Java不能返回元组,我不想为此创建一个单独的类,所以我想将bool作为out param传递.这就是我们的C++客户端所做的,通过引用传递bool.这适用于普通类,因为java类有对象的pass-by-ref(请参阅Is Java"pass-by-reference"或"pass-by-value"?以便对此进行详细讨论).但是像布尔这样的"Wrapper"类将它们的原始值存储为不可变,因此无法以这种方式更新.

使用布尔数组(带有一个条目)似乎很有用,但也许是最简单的方法.或者,可以返回布尔值并将创建的列表作为out参数传递回而不是作为返回[然后java客户端偏离C++,并且最好是它们保持大致相同的方法 - FYI也需要在C#中使用它. ]

Jon*_*eet 14

不,Java 没有对象的pass-by-ref; 它有"通过值传递参考"这不是一回事.

您绝对不能将任何内容作为"out"参数或Java中的引用传递 - 尽管您可以使用C#.

你能将"布尔加号列表"封装成另一种类型吗?他们真的有关系吗?使用布尔数组肯定是非常难看的.你可以编写一个MutableBoolean包装类型 - 但同样,这非常难看.通常我会说返回两个东西表明该方法应该被拆分,但当其中一个是布尔值时,它可能是相当合理的 - 比如int.TryParse来自C#的等等.

  • @Mech软件 - 不 - 那不是SCJP考试 - 因为它错了.http://bobcat.webappcabaret.net/javachina/faq/07.htm#pas_Q5 (6认同)
  • @Mech:我什么时候说*对象*被复制了?*reference*被复制.*reference*按值传递.你永远不会实际传递一个对象 - 你传递一个引用.而@Cincinnati Joe--它根本不需要凌乱."按值传递引用"不是杂乱或不准确. (5认同)

rsp*_*rsp 8

正如您所说,Boolen包装类是不可变的,因此您无法使用它来接收输出变量.

传入一个新列表来接收列表结果并返回布尔值对我来说听起来最自然,但你有充分的理由; 在多个实现中保持接口大致相同.

您可以通过创建自己的可变布尔值并传递对它的引用来解决此问题,例如:

public class Example {
    public class BooleanResult {
        private boolean result;

        public void setResult(boolean value) { result = value; }
        public boolean getResult() { return result; }
    }

    // ....
    public List doSomething(BooleanResult out) {
        List list;
        boolean result;

        // ...

        out.setResult(result);

        return list;
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用它像:

Example.BooleanResult out = new Example.BooleanResult();

List list = example.doSomething(out);

boolean result = out.getResult();
Run Code Online (Sandbox Code Playgroud)