我有一個Transaction看起來像這樣的類:
public class Transaction {
private Transaction parentTransaction;
private long amount;
private String orderNumber;
}
所以它有一個指向另一個的欄位Transaction。
還有一種方法是這樣的:
public void build(Transaction transaction) {
final long amount = transaction.getParentTransaction() == null ? transaction.getAmount() : transaction.getParentTransaction().getAmount();
final String orderNumber = transaction.getParentTransaction() == null ? transaction.getOrderNumber() : transaction.getParentTransaction().getOrderNumber();
// same pattern follows for more fields...
// do other stuff...
}
取決于 a 是否parentTransaction存在,例如,amount應使用來自parentTransaction或 的欄位transaction。我不喜歡這種方法的是該transaction.getParentTransaction() == null ? ...術語的重復使用。
是否有一些模式或方法可以避免這種情況?
uj5u.com熱心網友回復:
Optional 是一種選擇,但我認為有一個更簡單的解決方案:
public void build(Transaction transaction) {
Transaction buildFrom = transaction.getParentTransaction() == null ? transaction : transaction.getParentTransaction();
...
String orderNumber = buildFrom.getOrderNumber();
如果您不喜歡這種抽象組合,您可以更進一步,將該? :行放入一個小的輔助方法中。
uj5u.com熱心網友回復:
按照其他人的建議嘗試可選:
public void build(Transaction transaction) {
Transaction parentTransactionElseTransaction = Optional.of(transaction)
.map(t -> t.getParentTransaction())
.orElse(transaction);
final long amount = parentTransactionElseTransaction.getAmount();
final String orderNumber = parentTransactionElseTransaction.getOrderNumber();
// same pattern follows for more fields...
// do other stuff...
}
uj5u.com熱心網友回復:
public void build(Transaction transaction) {
final long amount = Optional.ofNullable(transaction.getParentTransaction()).orElse(transaction).getAmount();
final String orderNumber = Optional.ofNullable(transaction.getParentTransaction()).orElse(transaction).getOrderNumber();
// same pattern follows for more fields...
// do other stuff...
}
可以Optional.ofNullable().orElse()在這里使用
uj5u.com熱心網友回復:
使用 Optional 進行一些小的重構:
public void build(Transaction transaction) {
Transaction t = Optional.of(transaction).map(Transaction::getParent).orElse(transaction);
long amount = t.getAmount();
String orderNumber = t.getOrderNumber();
// etc
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/414446.html
標籤:
