簡體   English   中英

避免空值檢查條件運算符樣板的最佳實踐

[英]Best practice to avoid null-check conditional operator boilerplate

當無法使用null對象時,更換條件運算符null-checks樣板的最佳做法是:

public String getEmployeeName() {
    return employee == null ? null : employee.getName();
}

在Java 8或任何實用程序庫中是否有類似下面的內容?

public String getEmployeeName() {
    return nullable(employee, employee -> employee.getName());
}

private <T, R> R nullable(T nullable, Function<T, R> doIfNotNull) {
    return nullable == null ? null : doIfNotNull.apply(nullable);
}

我發現return employee == null ? null : employee.getName(); return employee == null ? null : employee.getName(); 是最可讀的,所以也許它是更好的解決方案,而不僅僅是讓你的代碼過於復雜。 它完成了工作,並沒有任何問題 - 所以不妨使用它。 這就是條件運算符的用途。

通常在嘗試決定使用哪種編程模式時,最好使用最易讀且最容易讓代碼的維護人員理解的模式。

您可以將代碼重構為:

public String getEmployeeName() {
    return Optional.ofNullable(employee).map(Employee::getName).orElse(null);
}

ofNullable從給定的雇員中創建一個Optional值:如果為null ,則返回空的Optional ; 否則Optional返回包含雇員。 然后,該Optional被映射到使用雇員的姓名map ,它返回一個新的Optional施加給定的映射器,如果Optional為非空並且一個空Optional如果Optional為空。 最后, orElse返回雇員的名稱或nullOptional是空的。

話雖如此,我認為將此代碼放在null -check和條件運算符上沒有任何附加價值:它可能會有更好的性能,也可能更容易閱讀。

Java 8具有新的Optional類,例如

private Optional<Employee> employee = Optional.empty();

public Optional<Employee> getEmployee() {
    return this.employee;
}
public void setEmployee(Employee employee) {
    this.employee = Optional.of(employee); // null not allowed
}
public void removeEmployee() {
    this.employee = Optional.empty();
}

employee永遠不會為null ,但可能是“空的”。

然后可以通過兩種方式實現getEmployeeName()方法:

// Returning Optional (never null)
public Optional<String> getEmployeeName() {
    return this.employee.map(Employee::getName);
}

// Standard getter (may return null)
public String getEmployeeName() {
    return this.employee.map(Employee::getName).orElse(null);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM