2016-11-23 1 views
0

Unter Berücksichtigung des folgenden Code:Try-Catch, optional/null und Lambda

  • obj nach nicht geändert worden durch Service intialised, aber aufgrund try/catch-Block, ist es nicht so effektiv als endgültig betrachtet . gibt es eine Möglichkeit, dies zu vermeiden?
  • Kann Optional als eine universelle Methode betrachtet werden, um eine Nullkontrolle zu vermeiden? In diesem Beispiel würde der Dienst stattdessen die Ausnahme auslösen oder null zurückgeben oder immer die Option Optional?

    //to be used outside try/catch block, object must be initialized as null 
    SomeObject obj = null; 
    try { 
        obj = someService.getSomeObject(); 
    } catch (ServiceException e) { 
        LOG.error("Something nasty happened", e); 
    } 
    
    //the service could have returned a null object 
    if(obj == null) { 
        LOG.error("Obj is null"); 
    } 
    
    //to be used in a lambda, object must be final 
    SomeObject objCopy = obj; 
    boolean test = someList.stream() 
         .anyMatch(o->o.equals(objCopy)); 
    
+0

"es wird nicht als effektiv endgültig betrachtet" Was meinst du damit? –

+0

@LutzHorn, eine Variable wird als effektiv endgültig betrachtet, wenn ihr Wert sich nach der Initialisierung nie ändert. –

Antwort

3

einfach den Versuch aufgespalten/Fang in einem separaten Verfahren (Dies ist im Allgemeinen gute Praxis, wie sie den Code besser lesbar macht. Siehe "Clean Code" von Robert Cecil Martin)

final SomeObject obj = getObjFromService(someService); 

...

private Optional<SomeObject> getObjFromService(Service someService) { 
    try { 
     return Optional.of(someService.getSomeObject()); 
    } catch (ServiceException e) { 
     LOG.error("Something nasty happened", e); 
    } 
    return Optional.empty(); 
} 

Sie können auch Null von der Methode getObjFromService zurückgeben, Sie können die Variable final immer noch deklarieren, da Sie sie nur einmal zuweisen.

0

machen objcopy final

final SomeObject objCopy = obj; 
boolean test = someList.stream() 
    .anyMatch(o->o.equals(objCopy)); 
+0

Ich erstelle eine objCopy in diesem Zweck, es ist effektiv zu diesem Zeitpunkt –

+0

war nicht da in der ursprünglichen Frage. Es tut uns leid –