在Swing中调用组件setter前先查询状态,这种做法是否合理?
结论:直接调用
setEnabled()即可,无需额外添加状态判断 1. Swing组件的setEnabled()内部已自带状态检查
Swing的AbstractButton(JButton的父类)实现setEnabled方法时,本身就会先对比传入的状态与组件当前状态:如果两者一致,会直接返回,不会执行后续的UI更新、事件派发等操作。你额外添加的if (!saveButton.isEnabled())判断,本质是在重复组件内部已经完成的工作。
2. 性能层面:额外判断反而冗余
你提到90%的场景下按钮已处于目标状态,但直接调用setEnabled()的开销,和先调用isEnabled()再做判断的开销几乎无差——甚至前者可能更高效:组件内部的状态检查是原生实现,无需额外的方法调用和条件分支逻辑,反而比手动判断更简洁直接。
3. 代码简洁性与维护性
去掉额外判断后,代码逻辑更直观清晰,减少了不必要的分支嵌套。同时,也避免了后续因组件内部实现变更(虽然概率极低)而导致手动判断逻辑失效的问题,代码可靠性更高。
针对你的场景,保留原代码写法即可:
private class CheckBoxListener implements ItemListener { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { saveButton.setEnabled(true); clearButton.setEnabled(true); } else if (e.getStateChange() == ItemEvent.DESELECTED && checkBoxList.stream().noneMatch(AbstractButton::isSelected)) { saveButton.setEnabled(false); clearButton.setEnabled(false); } } }
内容的提问来源于stack exchange,提问作者Sergey Zolotarev
相关产品推荐
相关产品推荐

