按需创建Java对象

时间:2019-01-24 08:50:03

标签: java oop object

我有一个Java私有方法,我试图找到在该方法内创建对象的最佳方法。以下是我正在尝试的两种不同方法:

方法A:

 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;
 }

很明显,两个代码段均正常运行,没有任何问题。我只是想找出更好的编码风格和标准。

4 个答案:

答案 0 :(得分:1)

让我们写真相表

  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 
}

优良作法是尽可能减少变量的范围。而且,如果实例化非常昂贵,您还希望减少实例化的时间。 这里,对象a仅在必要时初始化,并且其范围应尽可能小(只有一个 if 块)

答案 1 :(得分:0)

我相信,如果要使用 default 值初始化对象,则应在声明的位置进行

Object A = new Object();
if (conditionA) {
    ...
}

答案 2 :(得分:0)

方法A更好。

在这种情况下,请考虑不满足“ if”条件,并且条件变为“ else”。

如果条件B满足,它将返回,因此不会将内存分配给A。

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

答案 3 :(得分:0)

我将采用方法A,因为仅在需要时才需要初始化对象。

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

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

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

A = objSupplier.get();

(请注意,变量通常用小写/ camelCase编写)。