Создать объект Java по требованию - PullRequest
0 голосов
/ 24 января 2019

У меня есть приватный метод 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 голосов
/ 24 января 2019

Давайте напишем таблицу истинности

  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 
}

Хорошей практикой является максимально возможное сокращение диапазона переменных. И если инстанцирование дорого, вы также хотите сократить количество времени, когда вы его создаете. Здесь Object a инициализируется только при необходимости, и его область действия настолько мала, насколько это возможно (только один , если блок)

0 голосов
/ 24 января 2019

Подход A лучше.

При этом рассмотрим условие «если» не выполняется и оно входит в «else».

Там, если условие B выполнено, оно вернется.Таким образом, память не выделяется для A.

В подходе B ненужное выделение памяти выполняется, что бесполезно в приведенном выше сценарии.

0 голосов
/ 24 января 2019

Я бы пошел с подходом А, так как необходимо только инициализировать объект при необходимости.

Если инициализация этого объекта довольно сложна, чтобы избежать повторения, вы либо определяете вспомогательный метод static для инициализации объекта, либо вы используете Supplier<>:

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

и затем, в двух местах, где объект должен быть создан, вы делаете

A = objSupplier.get();

(обратите внимание, что переменные обычно пишутся в нижнем регистре / camelCase).

0 голосов
/ 24 января 2019

Я считаю, что если вы хотите инициализировать объект со значением default , вы должны сделать это в месте объявления

Object A = new Object();
if (conditionA) {
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...