2013-04-10 5 views
1

Я поля, такие какКак я могу сделать этот код лучше

variable1, variable2, variable3 .... и т.д.

и мои условия

if(variable1 != null && variable1 != 0) 
    myobject.setFirstValue(variable1); 

if(variable2 != null && variable2 != 0) 
myobject.setSecondValue(variable2); 

if(variable3 != null && variable3 != 0) 
myobject.setThirdValue(variable3); 

Как это я имеют почти 15 к рассмотрению. Есть ли способ написать все эти условия простым способом. Имена переменных не совсем то же, что и я. Они отличаются от того, что я разместил.

+6

Вам действительно нужно 15 переменных, а не массив? И действительно ли вы хотите называть 'setFirstValue' несколько раз, если несколько переменных не равны нулю и отличны от нуля? –

+0

Какова природа вашей программы? что именно вы делаете с этими переменными? – giorashc

+0

Я отправляю как состояние, город, улицу, имена. Мне нужно установить эти значения, если не null – PSR

ответ

5

Вы могли бы начать с ...

if (notNullOrZer0(variable1)) { 
    ... 
} 

private boolean notNullOrZero(Integer x) { 
    return x != null && x != 0; 
} 

Тогда, возможно, положить все эти переменные в List<Integer> ... это зависит от того, как устроена остальная часть кода ...

+0

Я обновил свой вопрос. Пожалуйста, посмотрите его один раз. Я отправил некоторую ошибку – PSR

+0

, если я вложу в список, как я знаю, какая переменная мне нужна установить, какой метод setter – PSR

+0

Все ли ваши переменные одинаковы? – blank

0

Вы можете положить все переменные в массиве и использовать цикл для проверки состояния и установите значения в myobject.setFirstValue(array[index]);

+0

, но мои методы настройки не такие же. Как я могу установить – PSR

5

вы можете создать метод isNotNullorequalsZero, который проверяет, не нулевой, а не равен нулю

private boolean isNotNullorequalsZero(Integer value){ 
    return value != null && value != 0; 
} 

и вы используете что -

if(isNotNullorequalsZero(variable1)) 
    myobject.setFirstValue(variable1); 

if(isNotNullorequalsZero(variable2)) 
myobject.setFirstValue(variable2); 

if(isNotNullorequalsZero(variable3)) 
myobject.setFirstValue(variable3); 
+1

Почему шаблонный код 'return true..false'. вы можете изменить свой код: «return value! = null && value! = 0;';) – Mik378

+0

Я заметил это, но спасибо :) –

+0

+1 для вашего ответа. Это также правильно. Но я могу принять только один ответ – PSR

0

либо модифицировать setFirstValue метод как

void setFirstValue(Integer var){ 
if(var !=null && var !=0) { 
//current logic of setFirstValue 
} 
} 

или если нет возможности изменить его, создать оболочку вызова в качестве (логического типа возврата уведомить если отказ в вызове)

boolean checkAndSetFirstValue(Integer var) { 
    if(var !=null && var !=0){ 
     setFirstValue(var); 
     return true; 
    } 
    return false; 
} 
+0

Но вы скрываете, что если что-то не так, вызывающий абонент не будет уведомлен об этом. Вы должны выбросить исключение в таком случае – giorashc

+0

yes thnx для указателя, но я предпочел бы альтернативный подход, когда я отредактировал код. – Ankit

0

Вы могли бы сделать метод под названием что-то вроде copyIfNonZero, и это, вероятно, выглядеть следующим образом:

public void copyIfNonZero(MyObject myObject, Integer value) { 
    if (value != null && value != 0) { 
     myObject.setFirstValue(value); 
    } 
} 

И текущий код будет сокращен до

copyIfNonZero(myobject, variable1); 
copyIfNonZero(myobject, variable2); 
copyIfNonZero(myobject, variable3); 
... 

или даже поместить переменные в Collection и итерация над этим:

Collection<Integer> values = ..... 
for(Integer value : values) { 
    copyIfNonZero(myObject, value); 
} 
+0

За исключением кода, который всегда будет установлен «FirstValue» ... –

+0

Как и в первой версии вопроса ... :) Но действительно, с обновленным вопросом этот подход не особенно полезен. – mthmulders

+0

о, не видели первую версию :) –

0

Если это что-то, что действительно часто встречается в вашем коде, и вы хотите инкапсулировать это поведение и избежать повторять это, я хотел бы сделать что-то вроде этого:

В виде инструментов или утилитами класса, создать статический метод:

public static void setPropertyIfNonNullNorZero(Object target, String propertyName, Integer value){ 

    //use some reflection tooling here, or write the whole thing yourself... I am using commons.beanutils here 

    if(value != null && value != 0){ 
     BeanUtils.setProperty(target, propertyName, value); 
    } 

} 

Этот код предполагает, что ваш целевой объект (MyObject) соблюдает соглашения о бобах (в основном, с именами получателей и сеттеров), и значение всегда является целым.

Затем использовать его как это:

Tools.setPropertyIfNonNullNorZero(myobject, "thirdValue", variable3); 
+0

Что происходит, когда вы реорганизуете имя свойства? – blank

+0

Конечно, если вы переименуете свойство, вы должны вручную изменить имя свойства в вызове метода, если ваш инструмент рефакторинга достаточно умен, чтобы обнаружить эти косвенные ссылки ... Это то же самое, что и во многих других случаях, когда бобы свойства ссылаются на их имя, а не на прямые вызовы метода getter по java-коду (например, HQL/JPAQL, JSP/JSTL и т. д.). –

Смежные вопросы