2016-12-14 5 views
-1

В Java это работает:В Java, спросите, если переменная STILL равна нулю после возможного изменения стоимости

String foo = a(); 
if(foo == null){ 
    foo = b(); 
} 
if(foo != null){ 
    list1.add(foo); 
} 

Однако его уродливым смотреть на, потому что это выглядит, как это должно быть обработано как если/else, даже если этого не может быть. Есть ли опрятный способ справиться с проверкой, является ли переменная STILL null после возможной установки ее на ненулевое значение?

+0

Ну, подход ООП состоял бы в реализации резервной картины. Попробуйте каждую реализацию резервной копии, пока вы не получите правильный результат. Вы также можете проверить класс «Необязательный <>» (https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html). – sturcotte06

+0

Или, если вы можете использовать Groovy, 'String foo = a()?: B()'. – chrylis

+0

если вы хотите избежать одного, если условие String foo = (a()! = Null)? a(): b(); if (foo! = Null) { list1.add (foo); } – Developer

ответ

1

У вас есть два варианта:

1) Optional класса

// if a() returns an Optional<String> 
String foo = a().orElse(b()); 
if (foo != null) list1.add(foo); 

2) Chain of Responsibility шаблон для откаты

// With a better interface name. 
interface Fallback { 
    // With a better method name. 
    String get(); 
} 

List<Fallback> fallbacks = new ArrayList<>() {{ }}; // add all fallbacks 
for (Fallback fallback : fallbacks) { 
    String foo = fallback.get(); 
    if (foo != null) { 
     list1.add(foo); 
     break; 
    } 
} 
0

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

Одна вещь, которую вы могли бы подумать, если проблема связана с кодом, заключается в переносе первых нескольких строк в функцию.

String getFoo() { 
    String _a = a(); 
    if(_a != null) return _a; 
    else return b(); 
} 

/*...*/ 

foo = getFoo(); 
if(foo != null) 
    list1.add(foo); 

В качестве альтернативы, вы можете написать специальный контейнер (или обертку вокруг любого типа list1 есть), который будет корректно обработать случай, когда он был принят null вместо того, чтобы любой объект, он ожидает.