如果您对如何修改问题标题有任何建议以便更具描述性,请随时说出来。
假设您有一个返回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修改对象。
你能想出为什么上述或其他方式之一更可取的原因吗?
由于
答案 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);
}
糟糕:你在第一行浪费记忆,因为引用无处使用。但仍然没有造成伤害