2016-11-22 8 views
0

Ich möchte ein Employee-Objekt mithilfe einer employeeId erstellen, und wenn die employeeId nicht gefunden wird, drucken Sie einfach eine Nachricht. Basierend auf meinem Verständnis kam ich mit folgenden:Optionale Verwendung in Java 8

private Optional<Employee> createEmployee(SearchParams params) { 

Optional<String> employeeId = searchEmpId(params); 

Optional<Employee> employeeOptional = employeeId.map(epmId -> new Employee()); 
employeeOptional.ifPresent(employee -> { 
    employee.setName(getEmpName(employeeId)); 
    employee.setSalary(getEmpSalary(employeeId)); 
}); 

employeeOptional.orElseGet(() -> { 
    LOG.warn("No emp records found for params {}.", params); 
    return null; 
}); 

return employeeOptional; 
} 

Gibt es einen Weg, um den obigen Code zu vereinfachen/zu optimieren? Ich glaube, es sollte einen einfachen Weg geben, das zu tun. Jede Hilfe wird sehr geschätzt.

+0

Nicht gut. Warum belästigst du dich überhaupt mit Optional? –

+0

Warum verwenden Sie 'employeeId.map' anstelle eines einfachen' if'? Warum sollten Lambdas verwendet werden, die kein Verhalten darstellen, wenn herkömmliche Logik funktioniert (und besser lesbar ist)? –

Antwort

1

Grundsätzlich ist dieser Weg

Optional<Employee> createEmployee(SearchParams params) { 
    return searchEmpId(params).map(id -> { 
    Employee e = new Employee(); 
    e.setName(getEmpName(id)); 
    e.setSalary(getEmpSalary(id)); 
    return e; 
}) 

Der Fall mit einem leeren Mitarbeiter ist eine Ausnahme zu Ihrem glücklichen Fluss und umgesetzt und mit dieser Art und Weise behandelt werden soll. Der Punkt, das zu tun ist, um explizite Anrufe

if(!empOptional.isPresent() {...} 

zu vermeiden, entweder eine Log-Anweisung zu schreiben oder eine leeres optional zurück, weil Sie mit der leeren optional zu tun haben, später in der Ablaufsteuerung in jedem Fall.

Also besser einen außergewöhnlichen Fluss, zum Beispiel

try { 
    Employee e = createEmployee(params).orElseThrow(() -> new EmployeeNotFoundException()); 
    e.practice("java"); 
} catch(EmployeeNotFoundExceptione e){ 
    LOG.info("not found, 404, whatever", e); 
} 

Natürlich legen Sie fest, wie gut diese Ausnahme auf einer oberen Schicht verarbeiten kann, so wie es für Ihren Fall geeignet ist.

+0

Aber wie drucke ich hier ein Protokoll für den negativen Fall? – Aarkan

0

Angenommen, Sie einen Konstruktor haben, der eine ID in der Employee-Klasse akzeptieren:

Optional<Employee> employee = employeeId.map(Employee::new) 
    .map(employee -> employee.setName(...)) 
    .map(employee -> employee.setSalary(...)); 

if (!employee.isPresent()) { 
    // log 
} 

return employee; 
0

So wie es sauberer zu machen ist nicht optional intern zu verwenden, da Sie nicht in irgendeiner Weise nützlich verwenden Sie .

Wenn Sie ein optionales an den Aufrufer zurückgeben wollen, damit sie entsprechend reagieren können, dann in Ordnung. Aber die Art, wie Sie es intern verwenden, macht den Code in keiner Form klarer. Also hier ist ein Vorschlag:

private Optional<Employee> createEmployee(SearchParams params) { 

    String employeeId = searchEmpId(params); 

    if (employeeId == null) { 
    LOG.warn("No emp records found for params {}.", params); 
    return Optional.empty(); 
    } 

    Employee employee = new Employee()); 
    employee.setName(getEmpName(employeeId)); 
    employee.setSalary(getEmpSalary(employeeId)); 
    return Optional.of(employee); 
} 

Als Neben nitpick: Wenn Sie ein Optional zu rufenden Klasse zurückkehren möchten, dass im Grunde erzählt die rufenden Klasse ‚diese leer sein könnte, und es ist an Ihnen zu handhaben, dass‘ . In diesem Fall würde ich es für eine schlechte Form halten, eine Warnung selbst zu protokollieren. Es ist impliziert, dass der aufrufende Code dieses Problem behandeln wird, also die Protokollierung. Ich würde hier auf Debug-Ebene interne Protokollierung tun.

0

Sie können weiter gehen und implementieren Martin Fowlers Special case Muster für Employee Einheit. Aber, Hauptnachteil hier ist, dass alle Employee bezogenen Sachen innerhalb SOMOF seiner Methoden getan werden sollten, weil nur passende Employee Instanz entscheiden sollte, was im besonderen Fall zu tun ist, und dieses Verhalten sollte nicht externalisiert werden.