创建需要从Java中的方法返回的对象

时间:2012-10-20 18:01:56

标签: java object methods instantiation

如果您对如何修改问题标题有任何建议以便更具描述性,请随时说出来。

假设您有一个返回Object的类方法,是否有在方法中创建对象的最佳实践或标准方法?澄清一下,见下文:

public MyCustomObject myMethod(String arg1, String arg2){
    try{
        if (something){
            ...
        } else {
            ...
        }
    } catch ( SomeException e ){
        ...
    } catch ( SomeOtherException e ){
        ...
    }

    return myCustomObject;
}

MyCustomObject有一个空构造函数,一个包含5个字段和getter / setter的构造函数。我需要在上面的(简化)流程的每种情况下返回一个有效的MyCustomObject。请不要专注于控制流本身。

我认为我可以: a)在方法的开头用函数初始化MyCustomObject类型的变量。为控制流中的每个不同情况分配一个新的MyCustomObject。最后归还它。 b)使用空构造函数在开头实例化MyCustomObject。使用流程中每个案例的setter修改对象。

你能想出为什么上述或其他方式之一更可取的原因吗?

由于

4 个答案:

答案 0 :(得分:2)

我更喜欢你未提及的选项3:为控制流中的每个不同情况创建一个新的MyCustomObject,并立即返回它。不需要变量,通常是:

if (foo) {
    return new MyCustomObject("foo");
}
if (bar) {
    return new MyCustomObject("x", "y");
}
// etc

这通常最终会减少嵌套,并且更容易阅读,因为只要您点击return语句,就完成了。

有些人坚持只有一个退出点的教条,但我认为这些日子有些毫无意义 - 它在你需要在返回之前进行清理的语言中有意义,但是使用垃圾收集和{ {1}}阻止其他资源清理,这是不必要的。

如果你尽快返回,你通常可以在代码中减少嵌套 - 这大大提高了可读性。

答案 1 :(得分:0)

所以:

MyCustomObject result = null;
if (something) {
    result = new MyCustomObject(a, b, c, d, e);
} else {
    result = new MyCustomObject(a, b, x, y, z);
}

或者

MyCustomObject result = new MyCustomObject();
if (something) {
    result.Name = arg1;
} else {
    result.Phone = arg2;
}

return result;

我真的不明白为什么我应该挑选一个而不是另一个!我可能会用B来确保我没有忘记初始化结果......但这不是我认为的好理由。

答案 2 :(得分:0)

在我的工作中,我个人更喜欢第一种方法(即,声明返回变量,将其分配给null,然后允许程序的实际逻辑根据需要实例化适当的对象。)

我发现这个更有用的原因是因为无论你在哪里调用方法,都可能想知道在创建对象时是否出现了问题,或者是否创建了一个有用的方法。执行空检查比尝试确定实例化对象是否为虚拟对象要容易得多。您会发现空检查通常是复杂程序控制流程的重要组成部分。如果我总是返回一个对象,无论发生什么,我的检查器都必须更加复杂。

例如,假设我有一个名为readItem()的方法,它返回一个自定义Item对象。在这个readItem()中,它从表中获取并提取一些数据并用它填充Item。现在,假设readItem()处理保证抛出异常的问题没有出错,但是我们想要阅读的Item的标准不在表中(例如,我们可能已提供没有项目存在的项目ID或其他内容)。然后,如果我返回一个实例化的Item而不是null,那么要想出来就更难了。

答案 3 :(得分:0)

选项1:

MyCustomObject myCustomObj = null;

for( index > list of cases ){

    myCustomObj = myMethod(param1, param2);

}

完美:您要声明变量一次并修改值。

选项2:

for( index > list of cases ){

    MyCustomObject myCustomObj = myMethod(param1, param2);

}

好:您一次又一次地重新声明变量并修改该值。

选项3:

MyCustomObject myCustomObj = new MyCustomObject();

for( index > list of cases ){

    myCustomObj = myMethod(param1, param2);

}

糟糕:你在第一行浪费记忆,因为引用无处使用。但仍然没有造成伤害