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

时间:2010-02-08 19:41:37

标签: java parameters pass-by-reference

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

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

6 个答案:

答案 0 :(得分:14)

不,Java 没有对对象进行pass-by-ref;它有“按值传递参考”,这不是一回事。

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

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

答案 1 :(得分:7)

正如您所说,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;
    }
}

并使用它:

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

List list = example.doSomething(out);

boolean result = out.getResult();

答案 2 :(得分:4)

  

我需要返回/更新布尔值,同时从方法返回一个东西列表。 Java无法返回元组,我不想为此

创建单独的类

我遇到了同样的问题,恕我直言的最佳解决方案通常是:

忘掉你的烦恼,然后单独上课。

我曾经对此犹豫不决,但是类用于封装值,所以请继续执行。

有可能,一旦你的函数返回一个自定义类的实例,你会发现还有其他功能可以很好地适应该类,或者其他方法可以使用该类作为参数或返回值,很快class会非常有用: - )。

如果您确实不想这样做,您可以随时将所有内容填充到java.util.List或java.util.Map中并返回该内容。但那真是太丑了:-(我也做过那样,后悔了。起初看起来似乎很简单,但随着代码的发展和增长,可读性受到影响(是整数列表,然后是Double,或者反之亦然?)。课程更有帮助。

注意:如果您认为顶级普通课程过度,则可以使用nested class,这对于仅用于“本地使用”的课程非常有用。

答案 3 :(得分:1)

我所做的返回多个值的方法是更改​​返回类型以返回一个对象数组。 [0]可能是bool,[1]可能是列表。

缺点是调用者必须知道从对象数组中适当地转换返回的对象,编译器无法检查你。

编辑:Here是从Java返回一对值的答案。

答案 4 :(得分:1)

您不能将任何基本类型用作Java中的“out”参数。这不会随时发生。

您也不能将任何对象版本(如Boolean,Integer,Float,Double等)用作'out'参数,因为它们是不可变的。你能做的就是编写你自己的类,或者在commons-lang(http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/mutable/MutableBoolean.html)中使用像MutableBoolean这样的东西。

例如:

public void setTrue(MutableBoolean b) {
    b.setValue(Boolean.TRUE);
}

答案 5 :(得分:-1)

正如rsp和许多其他人所提到的,它是不可改变的。但是,有一个名为AtomicBoolean的布尔变体,它是作为Java 1.5版中java.util.concurrent.atomic包的一部分引入的。如果您不想创建用于处理此类琐碎问题的类,则可以使用AtomicBoolean。看看这个。运行以下代码以便自己查看。

public static void main(String[] args) {
    AtomicBoolean value = new AtomicBoolean(false);
    System.out.println(value); // Prints false
    someMethod(value);
    System.out.println(value); // Prints true
}

void someMethod(AtomicBoolean a) {
    a.set(true);
}