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();
                    }
                    
                }
            }
        }
    });
}

代码不足之处

  1. 缺少注释,不易理解代码功能和实现。
  2. try-catch-finally语句块中,关闭流的操作应该放在finally块中,以确保在任何情况下都能正确关闭流。
  3. 文件路径应该使用相对路径而不是绝对路径,以免在不同环境中出现问题。
  4. 代码中的魔法数字应该使用常量或枚举类型来表示,以提高代码可读性和维护性。
  5. 窗口关闭事件中的操作可能比较耗时,应该开启新的线程来执行,避免阻塞主线程。

优化建议

  1. 添加注释:在每个代码块和关键方法之前添加注释,解释代码的功能和实现逻辑。
  2. 改进异常处理:将关闭流的操作放到 finally 块中,确保流在任何情况下都能被正确关闭。
  3. 使用相对路径:使用相对路径代替绝对路径来访问文件,确保代码在不同环境中都能正常运行。
  4. 引入常量:将代码中的魔法数字替换为常量或枚举类型,提高代码的可读性和可维护性。
  5. 多线程处理:将窗口关闭事件中的耗时操作放在新线程中执行,避免阻塞主线程。

优化后的代码示例

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;

**注意:**以上代码示例仅供参考,实际代码可能需要根据具体需求进行调整。

Java MyFrame 类构造函数代码分析及优化建议

原文地址: https://www.cveoy.top/t/topic/oZRV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录