![](/img/trans.png)
[英]Writing custom Lint rule to ensure null-check before every using to avoid NullPointerException
[英]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
返回雇員的名稱或null
是Optional
是空的。
話雖如此,我認為將此代碼放在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.