Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中将基元类型作为out参数传递_Java_Parameters_Pass By Reference - Fatal编程技术网

在Java中将基元类型作为out参数传递

在Java中将基元类型作为out参数传递,java,parameters,pass-by-reference,Java,Parameters,Pass By Reference,我需要在从方法返回内容列表时返回/更新布尔值。Java不能返回元组,我不想为此创建单独的类,所以我想我应该将bool作为out参数传递。这就是我们的C++客户端所做的,通过引用传递布尔。这对于一个普通的类来说是可行的,因为java排序有点像对象的pass-by-ref(有关这方面的详细讨论,请参阅)。但是像Boolean这样的“包装器”类将其原语值存储为不可变的,因此不能以这种方式更新 使用一个布尔数组(只有一个条目)似乎很简单,但可能是最简单的方法。或者,可以返回布尔值,并将创建的列表作为Ou

我需要在从方法返回内容列表时返回/更新布尔值。Java不能返回元组,我不想为此创建单独的类,所以我想我应该将bool作为out参数传递。这就是我们的C++客户端所做的,通过引用传递布尔。这对于一个普通的类来说是可行的,因为java排序有点像对象的pass-by-ref(有关这方面的详细讨论,请参阅)。但是像Boolean这样的“包装器”类将其原语值存储为不可变的,因此不能以这种方式更新

使用一个布尔数组(只有一个条目)似乎很简单,但可能是最简单的方法。或者,可以返回布尔值,并将创建的列表作为Out-PARAM返回,而不是返回(但是java客户端偏离C++,如果它们保持相同的方法最好,FI也需要在C中使用。)< /P> < P>不,java没有对象的通过ReF;它有“按值传递引用”,这不是一回事

在Java中,您绝对不能将任何内容作为“out”参数或通过引用传递,尽管在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();

我所做的返回多个值的工作是将返回类型更改为返回一个对象数组。[0]可以是bool,[1]可以是列表

缺点是调用者必须知道如何从对象数组中适当地强制转换返回的对象,而编译器无法为您进行检查

Edit:是从Java返回一对值的SO答案

我需要在从方法返回内容列表时返回/更新布尔值。Java不能返回元组,我不想为此创建单独的类

我也遇到过同样的问题,最好的解决方案通常是:

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

我曾经对此犹豫不决,但类是用来封装值的,所以继续做吧

很可能,一旦您的函数返回自定义类的实例,您会发现该类中还有其他功能,或者其他方法可以使用该类作为参数或返回值,很快该类就会非常有用:-)

如果您真的不想这样做,您可以将所有内容填充到java.util.List或java.util.Map中并返回。但这真的很难看:-(我也这么做了,后来后悔了。一开始可能看起来很简单,但随着代码的发展和增长,可读性会受到影响(是整数列表,然后是双精度列表,或者反之亦然)。类更有用


注意:如果您觉得顶级的常规类过于简单,可以使用,这对于仅用于“本地使用”的类来说很好。

您不能在Java中将任何基元类型用作“out”参数。这在任何时候都不会发生

您也不能将任何对象版本(如Boolean、Integer、Float、Double等)用作“out”参数,因为它们是不可变的。您可以编写自己的类或在commons lang()中使用类似MutableBoolean的内容

例如:

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

正如rsp和许多其他人所提到的,它是不可变的。但是,Java版本1.5中引入了一个名为布尔的变体。如果您不想创建类来处理这些琐碎的问题,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);
}

@Jon-Java通过引用传递对象,通过值传递原语。这是在SCJP上,我不确定“通过值传递引用”是什么意思。如果将对象作为参数传递,则修改对象并退出,对象将被更改。无“复制”一个实际对象存在。@Mech软件-不-这不在SCJP考试中-因为它是错误的。@Mech:我什么时候说过对象被复制了?引用被复制了。引用是按值传递的。你从来没有真正传递过对象-你传递过引用。@Cincinnati Joe-它根本不需要混乱。“按值传递引用”并不凌乱或不准确。@finnw:“指针”表示它意味着内存中的物理地址,它当然不必这样做。“句柄”会更好一些,尽管它在Windows中的含义略有不同。“对象ID”可能不太糟糕。真的是“引用”“一旦你得到它,就不算太坏了,而且很容易得到。”FiNW:“引用”是一个通用的词,比如指针()。所以它是一个非常合理的术语。我不认为C++调用引用是一个非常标准的术语,但是由于很多人来自C++,所以它被困在这个意义上。“参考"。我喜欢pair的想法-一位同事指出Google Collections有一个pair,但它似乎不在其1.0版本中。根据这一点,Google Collections还没有pair类:实际上,Java可以返回元组。您可以将返回值放入Java.util.List或Java.util.Map中并返回该值。仅供参考,请参阅下面答案中的注释关于java元组和re的混乱性