You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:30:12