1

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

我有一个过程可以实现几个对象,修改它们并升起一些标志。

    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方法是什么。

4

2 回答 2

3

当你这样做时:

titleCheck(MyData data);

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

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

等等

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

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

(我已经公开了这些字段,因为我将它用作一个简单的结构)。这种方法的优点是您正在使用 OO 将相关对象绑定在一起,并且您可以将方法放在上述类上以便于合并连续的结果。

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

于 2012-12-06T11:59:32.547 回答
1

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

要执行您建议的操作,您需要传递对对象的引用,例如boolean[]orAtomicBoolean并使用它。

于 2012-12-06T11:56:58.213 回答