Java中重构三元运算符的最优方案——基于isCredit的借贷端交叉赋值场景
重构三元运算符的最优方案
方案1:提取逻辑变量,消除重复判断
先根据isCredit提前确定借方付款方、贷方收款方对应的INN和名称,再统一赋值给DTO,避免重复编写相同的三元运算:
// 提前根据isCredit锁定双方信息 String debetPayerINN = isCredit ? record.getInnContractor() : record.getClientInn(); String debetPayerName = isCredit ? record.getNameContractor() : record.getClientName(); String creditReceiverINN = isCredit ? record.getClientInn() : record.getInnContractor(); String creditReceiverName = isCredit ? record.getClientName() : record.getNameContractor(); // 统一赋值 .setDebetSide(new DebetSideDto() .setPayerINN(debetPayerINN) .setPayerName(debetPayerName)) .setCreditSide(new CreditSideDto() .setReceiverINN(creditReceiverINN) .setReceiverName(creditReceiverName))
方案2:封装数据载体类,统一管理逻辑
如果这类交叉赋值场景较多,可封装一个简单的载体类来存储主体信息,通过方法返回对应的数据组合:
// 定义内部载体类,存储主体的INN和名称 private static class PartyInfo { private final String inn; private final String name; PartyInfo(String inn, String name) { this.inn = inn; this.name = name; } // 根据isCredit返回借方付款方、贷方收款方的信息对 public static Pair<PartyInfo, PartyInfo> getParties(Record record, boolean isCredit) { PartyInfo contractor = new PartyInfo(record.getInnContractor(), record.getNameContractor()); PartyInfo client = new PartyInfo(record.getClientInn(), record.getClientName()); return isCredit ? new Pair<>(contractor, client) : new Pair<>(client, contractor); } } // 使用时 Pair<PartyInfo, PartyInfo> parties = PartyInfo.getParties(record, isCredit); .setDebetSide(new DebetSideDto() .setPayerINN(parties.getLeft().inn) .setPayerName(parties.getLeft().name)) .setCreditSide(new CreditSideDto() .setReceiverINN(parties.getRight().inn) .setReceiverName(parties.getRight().name))
方案3:用静态方法提取重复逻辑(极简复用版)
如果不想额外定义类,可将判断逻辑封装到静态方法中,直接返回值数组:
private static String[] getPayerAndReceiverINN(Record record, boolean isCredit) { return isCredit ? new String[]{record.getInnContractor(), record.getClientInn()} : new String[]{record.getClientInn(), record.getInnContractor()}; } private static String[] getPayerAndReceiverName(Record record, boolean isCredit) { return isCredit ? new String[]{record.getNameContractor(), record.getClientName()} : new String[]{record.getClientName(), record.getNameContractor()}; } // 使用时 String[] inns = getPayerAndReceiverINN(record, isCredit); String[] names = getPayerAndReceiverName(record, isCredit); .setDebetSide(new DebetSideDto() .setPayerINN(inns[0]) .setPayerName(names[0])) .setCreditSide(new CreditSideDto() .setReceiverINN(inns[1]) .setReceiverName(names[1]))
方案选择建议
- 仅当前一处使用时,方案1改动最小、可读性提升最直接;
- 多处存在同类逻辑时,方案2能统一管理逻辑,大幅减少重复代码;
- 方案3是折中选项,无需额外类,同时实现了逻辑复用。
内容的提问来源于stack exchange,提问作者Aleksandr Berestov
相关产品推荐
相关产品推荐

