Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中创建需要从方法返回的对象_Java_Object_Methods_Instantiation - Fatal编程技术网

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

在Java中创建需要从方法返回的对象,java,object,methods,instantiation,Java,Object,Methods,Instantiation,如果您对如何修改问题标题以便更具描述性有任何建议,请随时提出 假设您有一个返回对象的类方法,是否有在该方法中创建对象的最佳实践或标准方法?如需澄清,请参见以下内容: public MyCustomObject myMethod(String arg1, String arg2){ try{ if (something){ ... } else { ... } } catch ( Som

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

假设您有一个返回对象的类方法,是否有在该方法中创建对象的最佳实践或标准方法?如需澄清,请参见以下内容:

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) 在方法开头用null初始化MyCustomObject类型的变量。为控制流中的每个不同情况分配一个新的MyCustomObject。最后还给我。 b) 在开始时使用空构造函数实例化MyCustomObject。使用流中每个案例的setter修改对象

你能想出为什么上面的一种或另一种方式更可取的原因吗

谢谢

所以:

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

?


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

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

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


例如,假设我有一个名为
readItem()
的方法,它返回一个自定义
Item
对象。在这个
readItem()
中,它从表中获取一些数据,并用它填充
项。现在,假设在处理
readItem()
过程中没有出现任何错误,从而保证抛出异常,但是我们想要读取的
Item
的条件不在表中(例如,可能我们提供了一个不存在任何项或其他项的项ID)。然后,如果我返回一个实例化的
项,而不是
null
,这就很难理解了。

选项1:

MyCustomObject myCustomObj = null;

for( index > list of cases ){

    myCustomObj = myMethod(param1, param2);

}
for( index > list of cases ){

    MyCustomObject myCustomObj = myMethod(param1, param2);

}
MyCustomObject myCustomObj = new MyCustomObject();

for( index > list of cases ){

    myCustomObj = myMethod(param1, param2);

}
Perfect:您只需声明一次变量并修改值

选项2:

MyCustomObject myCustomObj = null;

for( index > list of cases ){

    myCustomObj = myMethod(param1, param2);

}
for( index > list of cases ){

    MyCustomObject myCustomObj = myMethod(param1, param2);

}
MyCustomObject myCustomObj = new MyCustomObject();

for( index > list of cases ){

    myCustomObj = myMethod(param1, param2);

}
好:您正在一次又一次地重新定义变量并修改值

选项3:

MyCustomObject myCustomObj = null;

for( index > list of cases ){

    myCustomObj = myMethod(param1, param2);

}
for( index > list of cases ){

    MyCustomObject myCustomObj = myMethod(param1, param2);

}
MyCustomObject myCustomObj = new MyCustomObject();

for( index > list of cases ){

    myCustomObj = myMethod(param1, param2);

}

不好:您在第一行浪费内存,因为引用未被使用。但仍然不会造成任何伤害

我更喜欢您没有提到的选项3:为控制流中的每个不同情况创建一个新的MyCustomObject,并立即返回它。无需变量,通常:

if (foo) {
    return new MyCustomObject("foo");
}
if (bar) {
    return new MyCustomObject("x", "y");
}
// etc
这通常以更少的嵌套结束,并且更容易阅读,因为只要点击
return
语句,就完成了

有些人坚持只拥有一个退出点的教条,但我认为这在当今有些毫无意义——在需要在返回之前进行清理的语言中,这是有意义的,但是对于垃圾收集和其他资源清理的
最后
块,这是不必要的


如果您尽快返回,代码中的嵌套通常会减少,这大大提高了可读性。

您不能“将MyCustomObject实例化为null”-您可以声明MyCustomObject类型的变量,并为其指定null引用作为其初始值,但这不是实例化MyCustomObject。区分变量、引用和对象非常重要。感谢您的评论!我编辑了这个问题,这样大家就更清楚了,我知道变量、对象和引用是什么,所以我们不需要关注:)我不认为第一个选项是“完美的”-我们从分配一个
null
值开始,这没有任何意义。我看不出有这个变量有任何意义-我的推理见我的答案…耶。。这里没有备用变量。。但物体在这里。如果他想用这个物体做点什么,比如说一个简单的比较,他可以在途中阻止它..你也可以在需要用我的方法的情况下这样做。。。当局部变量有用时,你仍然可以使用它,而没有一个变量在整个方法的范围内。很长时间以来,我一直在使用这两种方法,这取决于在给定的时间里什么看起来更好,或者我的情绪如何:D但是,每次我到了类似的点,我确实发现自己花时间思考最好的选择。所以我想我应该找人帮我弄清楚我是否需要一劳永逸地解决这个问题