不使用`return`将值传递给调用者

时间:2014-10-01 21:35:33

标签: java oop variable-assignment pass-by-reference

我有以下两个函数,我需要在第二个函数中设置一个布尔值,但我需要稍后在调用函数中使用该值。

限制:

  1. 我无法在第二个函数中返回布尔值。
  2. 由于线程安全,我不能将它用作全局变量。
  3. 实现这一目标的最有效,最干净的方法是什么?

    private void F1()
    {
        boolean foo = false;
        List<String> result = F2(foo);
    
        if(foo)
        {
            // do something
        }
    }
    
    private List<String> F2(boolean foo)
    {
    // Logic to set the result
        List<String> result = new ArrayList();
    
        if(condition)
        {
            foo = true;
        }
    
        return result;
    }
    

2 个答案:

答案 0 :(得分:3)

您可以在boolean周围使用可变包装器来模拟传递引用。 AtomicBoolean可以为此目的重新拨款。你不会将它用于它的原子性,只能在一个函数中设置它的值并在另一个函数中读取它。

private void F1()
{
    AtomicBoolean foo = new AtomicBoolean(false);
    List<String> result = F2(foo);

    if(foo.get())
    {
        // do something
    }
}

private List<String> F2(AtomicBoolean foo)
{
// Logic to set the result
    List<String> result = new ArrayList();

    if(condition)
    {
        foo.set(true);
    }

    return result;
}

另一种常见的,甚至是更为常见的方法是使用1元素阵列。

boolean[] foo = new boolean[] {false};

同样的伎俩适用。 F2会做

foo[0] = true;

这很丑陋,但你不时会看到它,因为嘿,有时你必须做你必须做的事。

答案 1 :(得分:1)

分配foo完全没用,因为这不会反映在调用方法中。

但是有几种方法可以达到相同的结果:

使用数组:

private void F1() {
    boolean foo[] = new boolean[1];
    List<String> result = F2(foo);

    if(foo[0]) {
        // do something
    }
}

private List<String> F2(boolean[] foo) {
// Logic to set the result
    List<String> result = new ArrayList();

    if(condition) {
        foo[0] = true;
    }

    return result;
}

或任何其他可以保存值而不更改其引用的结构(AtomicBoolean就是一个例子)。

更改处理返回值的方式:

private void F1() {
    List<String> result = F2();

    if(result != null) {
        // do something
    }
}

private List<String> F2() {
// Logic to set the result
    List<String> result = new ArrayList();

    if(condition) {
        return result;
    }

    return null;
}

返回null,其中Object是预期的,这是指示出现问题并且结果不被视为有效的常用方法。不要误以为空的结果List,这可能表明一切都很好,没有什么可以返回。

抛出异常:

private void F1() {
    try {
        List<String> result = F2();
        // do something
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private List<String> F2() {
// Logic to set the result
    List<String> result = new ArrayList();

    if(!condition) {
        throw new Exception("Condition not met");
    }

    return result;
}

此处可以是已检查或未检查的异常,具体取决于您想要的效果。也常用,例如表示输入不正确,由于外部原因(I / O)而出现一些错误,系统处于不允许此操作的状态......