Java中如何优化外部程序路径校验的重复Swing按钮事件代码
优化方案
核心思路是把重复的判断、异常处理逻辑抽离为公共方法,仅将各个程序的差异化参数单独维护,新增程序时无需重复编写逻辑,只需要传入对应参数即可。
步骤1:封装通用执行方法
首先实现一个公共工具方法,接收程序本地路径、程序名称、下载页地址三个参数,统一处理所有公共逻辑:
import java.awt.*; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; /** * 启动外部程序的通用逻辑 * @param appPath 程序本地exe路径 * @param appName 程序名称,用于日志提示 * @param downloadUrl 程序不存在时跳转的下载页地址,无下载页可传null */ private void launchApp(String appPath, String appName, String downloadUrl) { File appFile = new File(appPath); if (!appFile.exists()) { System.err.printf("File Error, %s is not found!%n", appName); // 配置了下载地址则跳转下载页 if (downloadUrl != null && !downloadUrl.isBlank()) { try { URI uri = new URI(downloadUrl); Desktop.getDesktop().browse(uri); } catch (IOException | URISyntaxException e) { System.err.println("Unknown Error, Exception found\n" + e); } } } else { Warning_MSG(appFile); } }
注意:Java字符串中Windows路径的单斜杠\需要替换为双斜杠\\,否则会出现转义错误。
步骤2:改造原有按钮点击事件
所有按钮的点击事件仅需要调用上述通用方法,传入对应参数即可,代码大幅简化:
private void chromeMouseClicked(java.awt.event.MouseEvent evt) { launchApp("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe", "Google Chrome", "https://google.com/chrome"); } private void firefoxMouseClicked(java.awt.event.MouseEvent evt) { launchApp("C:\\Program Files\\Mozilla Firefox\\firefox.exe", "Mozilla Firefox", "https://www.mozilla.org/en-GB/firefox/download/thanks/"); } private void ieMouseClicked(java.awt.event.MouseEvent evt) { launchApp("C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe", "iExplorer", null); } private void edgeMouseClicked(java.awt.event.MouseEvent evt) { launchApp("C:\\Windows\\SystemApps\\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\\MicrosoftEdge.exe", "Microsoft Edge", null); }
可选进阶优化:枚举统一管理程序配置
如果后续需要新增大量程序,可以用枚举类统一维护所有程序的配置,避免参数零散分布:
enum ExternalApp { CHROME("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe", "Google Chrome", "https://google.com/chrome"), FIREFOX("C:\\Program Files\\Mozilla Firefox\\firefox.exe", "Mozilla Firefox", "https://www.mozilla.org/en-GB/firefox/download/thanks/"), IE("C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe", "iExplorer", null), EDGE("C:\\Windows\\SystemApps\\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\\MicrosoftEdge.exe", "Microsoft Edge", null); public final String appPath; public final String appName; public final String downloadUrl; ExternalApp(String appPath, String appName, String downloadUrl) { this.appPath = appPath; this.appName = appName; this.downloadUrl = downloadUrl; } }
改造通用方法直接接收枚举参数:
private void launchApp(ExternalApp app) { File appFile = new File(app.appPath); if (!appFile.exists()) { System.err.printf("File Error, %s is not found!%n", app.appName); if (app.downloadUrl != null && !app.downloadUrl.isBlank()) { try { URI uri = new URI(app.downloadUrl); Desktop.getDesktop().browse(uri); } catch (IOException | URISyntaxException e) { System.err.println("Unknown Error, Exception found\n" + e); } } } else { Warning_MSG(appFile); } }
按钮调用会更简洁:
private void chromeMouseClicked(java.awt.event.MouseEvent evt) { launchApp(ExternalApp.CHROME); }
内容的提问来源于stack exchange,提问作者Ali Sadykov
相关产品推荐
相关产品推荐

