为了账号安全,请及时绑定邮箱和手机立即绑定

按需创建 Java 对象

按需创建 Java 对象

弑天下 2022-05-21 20:43:42
我有一个 java 私有方法,我正在尝试找到在该方法中创建对象的最佳方法。以下是我正在尝试的两种不同方法:方法一: private void createObject() {     Object A;     if (conditionA) {         A = new Object();         //do some Action X with object A     } else {         //Do something without object A         if (conditionB) {             return;         }         A = new Object();         //do some Action Y with object A     }     return; }方法 B: private void createObject() {     Object A = new Object()     if (conditionA) {         //do some action X with Object A     } else {         //Do something without Object A         if (conditionB) {             return;         }         //do some action Y with Object A     }     return; }显然,两个代码片段都可以正常工作并且没有任何问题。我只是想找出更好的编码风格和标准。
查看完整描述

3 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

让我们写真值表


  A  |   B   |      Expected Outcome               

-----+-------+-------------------------------

True | True  | do X with object A               

True | False | do X with object A               

False| False | do Y with object A               

False| True  | do something without object A 

-----+-------+-------------------------------

我认为这可以转化为:


boolean doXWithA = conditionA;

boolean doYWithA = !conditionA && !conditionB;

boolean doSomethingWithA = doXWithA || doYWithA;

if(doSomethingWithA)

    Object a = new Object();

    if (doXWithA) {

        // do X with object A 

    } else if (doXWithB) {

        // do X with object B 

    }

} else {

    // do something without object A 

}

好的做法是尽可能减少变量的范围。如果实例化很昂贵,您还希望减少实例化它的次数。这里 Objecta只在必要时才初始化,并且它的范围尽可能小(只有一个if块)


查看完整回答
反对 回复 2022-05-21
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

方法 A 更好。

在那,考虑“如果”条件不满足,它进入“其他”。

如果满足条件B,那么它将返回。所以内存没有分配给A。

在方法 B 中,进行了不必要的内存分配,这在上述情况下没有用。


查看完整回答
反对 回复 2022-05-21
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

我会采用方法 A,因为只需要在需要时初始化对象。

如果该对象的初始化相当复杂,为了避免重复自己,您可以定义一个static辅助方法来初始化该对象,或者您通过以下方式进行Supplier<>

Supplier<Type> objSupplier = () -> new Type(a, b, c, d, whatever)

然后,在应该创建对象的两个地方,你做

A = objSupplier.get();

(请注意,变量通常以小写/驼峰形式编写)。


查看完整回答
反对 回复 2022-05-21
  • 3 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信