优化重复方法:如何通用化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
相关产品推荐
相关产品推荐

