Java MyFrame 类构造函数代码分析及优化建议
Java MyFrame 类构造函数代码分析及优化建议
以下代码展示了 MyFrame 类的构造函数,该函数用于初始化 MyFrame 窗口并进行一些必要的设置:
public MyFrame() throws Exception {
int i=modelChoose();
if (i==-1){
System.exit(0); //程序退出
}
myPanel = new MyPanel(i);
new Thread(myPanel).start();
this.setSize(1300, 820);
this.add(myPanel);
this.addKeyListener(myPanel);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
//监听关闭窗口事件
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
try {
Vector<EnemyTank> tanks = myPanel.getEnemyTanks();
for (int i = 0; i < tanks.size(); i++) {
tanks.get(i).getShots().clear();
}
//对象输出流
oos = new ObjectOutputStream(new FileOutputStream(new File(MyFrame.class.getResource('../recorder1.txt').toURI())));
//将记录对象Recorder写到文件
oos.writeObject(myPanel.getRecorder());
} catch (Exception e1) {
e1.printStackTrace();
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
}
});
}
代码不足之处
- 缺少注释,不易理解代码功能和实现。
- try-catch-finally语句块中,关闭流的操作应该放在finally块中,以确保在任何情况下都能正确关闭流。
- 文件路径应该使用相对路径而不是绝对路径,以免在不同环境中出现问题。
- 代码中的魔法数字应该使用常量或枚举类型来表示,以提高代码可读性和维护性。
- 窗口关闭事件中的操作可能比较耗时,应该开启新的线程来执行,避免阻塞主线程。
优化建议
- 添加注释:在每个代码块和关键方法之前添加注释,解释代码的功能和实现逻辑。
- 改进异常处理:将关闭流的操作放到 finally 块中,确保流在任何情况下都能被正确关闭。
- 使用相对路径:使用相对路径代替绝对路径来访问文件,确保代码在不同环境中都能正常运行。
- 引入常量:将代码中的魔法数字替换为常量或枚举类型,提高代码的可读性和可维护性。
- 多线程处理:将窗口关闭事件中的耗时操作放在新线程中执行,避免阻塞主线程。
优化后的代码示例
public MyFrame() throws Exception {
// 选择游戏模式
int gameMode = modelChoose();
// 如果游戏模式选择失败,则退出程序
if (gameMode == -1) {
System.exit(0);
}
// 创建游戏面板
myPanel = new MyPanel(gameMode);
// 启动游戏面板线程
new Thread(myPanel).start();
// 设置窗口大小
this.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
// 将游戏面板添加到窗口
this.add(myPanel);
// 为窗口添加键盘监听器
this.addKeyListener(myPanel);
// 设置窗口关闭操作
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置窗口可见
this.setVisible(true);
// 监听窗口关闭事件
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// 清理游戏数据
clearGameResources();
// 保存游戏记录
saveGameRecord();
}
});
}
// 清理游戏资源
private void clearGameResources() {
Vector<EnemyTank> tanks = myPanel.getEnemyTanks();
for (int i = 0; i < tanks.size(); i++) {
tanks.get(i).getShots().clear();
}
}
// 保存游戏记录
private void saveGameRecord() {
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(MyFrame.class.getResource("../recorder1.txt").toURI())))) {
oos.writeObject(myPanel.getRecorder());
} catch (Exception e) {
e.printStackTrace();
}
}
// 窗口宽度
private static final int WINDOW_WIDTH = 1300;
// 窗口高度
private static final int WINDOW_HEIGHT = 820;
**注意:**以上代码示例仅供参考,实际代码可能需要根据具体需求进行调整。
原文地址: https://www.cveoy.top/t/topic/oZRV 著作权归作者所有。请勿转载和采集!