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

优化重复方法:如何通用化ComboBox重复代码以减少冗余?

当然可以!这种重复的switch逻辑完全可以通过通用化改造来精简代码,减少冗余。我给你几个实用的方案,一步步来优化:

方案1:抽离映射关系,创建通用方法

先把文本和票数的对应关系抽成一个统一的映射表,然后写一个通用方法处理所有ComboBox的取值逻辑,不用再为每个ComboBox写重复的switch:

首先定义一个静态映射常量(可以放在你的类里,或者单独的工具类中):

private static final Map<String, Integer> TICKET_TEXT_MAP = Map.of(
    "One", 1,
    "Two", 2,
    "Three", 3,
    "Four", 4,
    "Five", 5,
    "Six", 6
);

然后写通用的票数获取方法:

public int getTicketNumber(ComboBox<?> comboBox) {
    if (comboBox.getValue() == null) {
        return 0;
    }
    String selectedText = comboBox.getValue().toString();
    // getOrDefault直接处理默认情况,替代switch的default分支
    return TICKET_TEXT_MAP.getOrDefault(selectedText, 0);
}

现在原来的numberTicket1()就可以简化成一行,其他ComboBox的处理方法也一样:

public void numberTicket1() {
    numberOfTickets = getTicketNumber(no1);
}

// 比如处理第二个ComboBox的方法
public void numberTicket2() {
    numberOfTickets = getTicketNumber(no2);
}
方案2:给ComboBox绑定带值的自定义选项(更优雅)

如果你的ComboBox是可以自定义选项的,推荐用这个方案——直接把选项做成包含显示文本和对应票数的对象,这样选中后直接拿数字,完全避免字符串转换和switch:

先定义一个简单的选项类:

public class TicketOption {
    private final String displayText;
    private final int ticketCount;

    public TicketOption(String displayText, int ticketCount) {
        this.displayText = displayText;
        this.ticketCount = ticketCount;
    }

    // 重写toString,让ComboBox显示文本内容
    @Override
    public String toString() {
        return displayText;
    }

    public int getTicketCount() {
        return ticketCount;
    }
}

初始化ComboBox时添加这些自定义选项:

ComboBox<TicketOption> no1 = new ComboBox<>();
no1.getItems().addAll(
    new TicketOption("One", 1),
    new TicketOption("Two", 2),
    new TicketOption("Three", 3),
    new TicketOption("Four", 4),
    new TicketOption("Five", 5),
    new TicketOption("Six", 6)
);

现在获取票数的逻辑变得超级简洁,还能避免空指针问题:

public void numberTicket1() {
    TicketOption selected = no1.getValue();
    numberOfTickets = selected != null ? selected.getTicketCount() : 0;
}
方案3:用枚举管理固定选项(类型安全)

如果你的票选选项是固定不会变动的,用枚举来管理会更安全,还能提升代码可读性:

先定义枚举类:

public enum TicketCount {
    ONE("One", 1),
    TWO("Two", 2),
    THREE("Three", 3),
    FOUR("Four", 4),
    FIVE("Five", 5),
    SIX("Six", 6);

    private final String displayText;
    private final int count;

    TicketCount(String displayText, int count) {
        this.displayText = displayText;
        this.count = count;
    }

    // 根据文本查找对应的枚举
    public static TicketCount fromText(String text) {
        for (TicketCount tc : values()) {
            if (tc.displayText.equals(text)) {
                return tc;
            }
        }
        return null;
    }

    public int getCount() {
        return count;
    }

    @Override
    public String toString() {
        return displayText;
    }
}

初始化ComboBox时直接用枚举值:

ComboBox<TicketCount> no1 = new ComboBox<>();
no1.getItems().addAll(TicketCount.values());

获取票数的方法:

public void numberTicket1() {
    TicketCount selected = no1.getValue();
    numberOfTickets = selected != null ? selected.getCount() : 0;
}

这几个方案里,方案2和3更推荐,因为它们是类型安全的,不会出现字符串匹配错误的问题;方案1则适合快速改造现有代码,改动最小。

内容的提问来源于stack exchange,提问作者Karishma Parmar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:27:19