繁体   English   中英

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

[英]Passing primitive types as out param in Java

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

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

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

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

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

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

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

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

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

我曾经对此犹豫不决,但是类是为了封装值,所以继续做下去。

有可能,一旦你的函数返回一个自定义类的实例,你会发现有更多的功能适合该类,或者其他方法可以使用该类作为参数或返回值,很快该类将是相当有用:-)。

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

注意:如果您认为顶级常规类过度,则可以使用嵌套类 ,这对于仅用于“本地使用”的类很有用。

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

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

例如:

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

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

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

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

正如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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM