java函数原语通过引用传递

时间:2012-12-06 11:54:37

标签: java function reference primitive

我多次遇到这个问题,所以我在这里问什么是最佳实践

我的过程可以实现多个对象,修改它们并升起一些标记。

    boolean erros = false;
    for(MyData data: allData){
    //...

        //@ToDo  move this to a function titleCheck()
        if(data.getTitle().isEmpty()){
            data.setTitle('none');
            erros = true;
        }

        if(data.getTitle().equals('BIG')){
            data.setTitle('small')
        }

        if(data.getTitle().equals('error')){
            errors = true;
        }

    //...
    }

我需要一个函数来更新数据并更改一个或多个标志 所以首选的语法是这样的:

MyData updatedData = titleCheck(MyData data, &erros){...}

但是布尔人不能通过引用传递,所以它们的工作原理是:

boolean errors = titleCheck(MyData dataForUpdate){...}

女巫的方式不太直观..(至少对我而言......来自PHP背景) 如果要更新几个标志,问题会变得更大。

那么......处理这种结构的Java方法是什么。

2 个答案:

答案 0 :(得分:3)

执行此操作时:

titleCheck(MyData data);

根据上面的代码,您实际上是在更改数据对象 - 而不是的副本。因此,您可以返回成功/失败布尔值,并且您不必返回传递的对象。所以现在你可以将这些值组合起来。

boolean error = false;
error |= titleCheck(...);
error |= nameCheck(...);

如果你想传递对象和状态,你可以简单地声明一个返回类:

class ReturnResult {
   public boolean error;
   public MyData data;
}

(因为我将它用作一个简单的结构,所以我将这些字段公之于众)。这种方法的优点是你使用OO将相关对象连接在一起,你可以在上面的类中放置方法,以便合并连续的结果。

最后我注意到你在MyData对象上调用了很多方法,并确定了该对象之外的成功/失败。我宁愿把这个放在 MyData对象中。然后,MyData对象可以存储其自己的有效/无效状态,您可以通过isValid()方法或类似方法询问它自己的状态。这似乎是一种在这里做事的OO方法。

答案 1 :(得分:1)

Java不支持按引用传递。甚至引用都是按值传递的。

要执行您的建议,您需要传递对boolean[]AtomicBoolean等对象的引用,然后使用它。