【问题标题】:Ideas for optimizing this code? (Java Bukkit)优化此代码的想法? (Java Bukkit)
【发布时间】:2021-02-09 11:18:21
【问题描述】:

你有什么想法吗?我想改进设计,因为看到这么多 if 语句会伤害我的眼睛,而且有时可能有害,我想尝试在速度方面对其进行优化。这是代码:

public void createFiles() {
    File LangFolder = new File(this.getDataFolder() + File.separator + "lang");
    File LangEN = new File(this.getDataFolder() + File.separator + "lang" + File.separator + "Lang-EN.yml");
    File LangIT = new File(this.getDataFolder() + File.separator + "lang" + File.separator + "Lang-IT.yml");
    File Jailsettings = new File(this.getDataFolder() + File.separator + "jailsettings.yml");
    File Stats = new File(this.getDataFolder() + File.separator + "stats.yml");
    File Chestrefill = new File(this.getDataFolder() + File.separator + "chestrefill.yml");
    if(!LangFolder.exists()) createDir(this.getDataFolder() + File.separator + "%dir%",  "lang", "Dir");
    if(!LangEN.exists()) createDir(this.getDataFolder() + File.separator + "lang" + File.separator + "%dir%", "Lang-EN.yml", "File");
    if(!LangIT.exists()) createDir(this.getDataFolder() + File.separator + "lang" + File.separator + "%dir%", "Lang-IT.yml", "File");
    if(!Jailsettings.exists()) createDir(this.getDataFolder() + File.separator + "%dir%", "jailsettings.yml", "File");
    if(!Stats.exists()) createDir(this.getDataFolder() + File.separator + "%dir%", "stats.yml", "File");
    if(!Chestrefill.exists()) createDir(this.getDataFolder() + File.separator + "%dir%", "chestrefill.yml", "File");
    if(!getConfig().getString("ConfigStatus").equals("UXVlc3RvUGx1Z2luw6hkaU1pY2hlbGU=")) {
        try {
            YamlConfiguration.loadConfiguration(LangIT).options().copyDefaults(true);
            YamlConfiguration.loadConfiguration(LangEN).options().copyDefaults(true);
            saveResource( "lang" + File.separator + LangIT.getName(), true);
            saveResource( "lang" + File.separator + LangEN.getName(), true);
            getConfig().set("ConfigStatus", "UXVlc3RvUGx1Z2luw6hkaU1pY2hlbGU=");
            saveConfig();
        } catch (Exception e) {
            e.printStackTrace();
            getConfig().set("ConfigStatus", "Reset");
            saveConfig();
        }
    }
}

【问题讨论】:

  • 第一步,重用不变的变量(如this.getDataFolder(),第二步丢弃不会重用的中间值(如LangEN,然后,创建可以简化的流程的方法(例如get(String file)。提供的代码并不“糟糕”,但似乎同时有许多上下文。本地化应该是它自己的流程,配置另一个,那些在createFiles一次似乎太多了
  • 在尝试重构/优化它之前,您需要编写一组适当的测试。否则你可能会陷入漫长的调试过程。
  • 第二步可能是删除硬编码的字符串。您的路径可能应该是静态字符串,因此您可以在整个代码库中重用该字段。配置初始化应该使用另一种方法,并且这些键值也应该存储在静态常量中。如果您将配置移动到另一个方法,文件不应该是局部变量,而是字段。 catch 块看起来很烦人,因为如果saveConfig() 总是引发错误,它将退出程序并且实际上不会保存任何状态。
  • @Deadbeef 是的,但是,现在我有一个新错误,我无法继续,IntelliJ 告诉我:无法运行程序“C:\Users\Mike\.jdks\adopt-openj9- 1.8.0_282\bin\java.exe”(在目录“C:\Users\Mike\AppData\Local\JetBrains\IdeaIC2020.3\compile-server”中):格式错误的参数已嵌入引用:-Djava.endorsed.dirs= \"\" 当我开始构建时...
  • 这绝对与你的问题无关。

标签: java bukkit


【解决方案1】:

方法ensureFolderExists(File path)怎么样? 你可以反复调用它,只需要担心每行有一个目标路径。

但是你甚至不必实现那个方法,Java API 已经有了https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/File.html#mkdirs()。因此,通过创建文件对象并调用 .mkdirs() 方法,您应该已经完成​​了。不再需要 IF 条件。

【讨论】:

    【解决方案2】:

    如果不完全重做处理这些文件的数据的方式,我认为做类似的事情看起来很不错。

    我在类中声明了 Files,因此如果您以后需要从代码中的其他位置引用这些 File 对象实例,您可以轻松地做到这一点。

    public class temp {
        public static File LangFolder;
        public static File LangEN;
        public static File LangIT;
    
        public static File Stats;
        public static File Jailsettings;
        public static File Chestrefill;
    
        public void createFiles() {
            File thisDataFolder = this.getDataFolder();
    
            LangFolder = new File(thisDataFolder + File.separator + "lang");
            LangEN = new File(thisDataFolder + File.separator + "lang" + File.separator + "Lang-EN.yml");
            LangIT = new File(thisDataFolder + File.separator + "lang" + File.separator + "Lang-IT.yml");
    
            Jailsettings = new File(thisDataFolder + File.separator + "jailsettings.yml");
            Stats = new File(thisDataFolder + File.separator + "stats.yml");
            Chestrefill = new File(thisDataFolder + File.separator + "chestrefill.yml");
    
            if(!LangFolder.exists()) createDir(thisDataFolder
                    + File.separator + "%dir%",  "lang", "Dir");
            if(!LangEN.exists()) createDir(thisDataFolder +
                    File.separator + "lang" + File.separator + "%dir%", "Lang-EN.yml", "File");
            if(!LangIT.exists()) createDir(thisDataFolder +
                    File.separator + "lang" + File.separator + "%dir%", "Lang-IT.yml", "File");
    
            if(!Jailsettings.exists()) createDir(thisDataFolder +
                    File.separator + "%dir%", "jailsettings.yml", "File");
            if(!Stats.exists()) createDir(thisDataFolder +
                    File.separator + "%dir%", "stats.yml", "File");
            if(!Chestrefill.exists()) createDir(thisDataFolder +
                    File.separator + "%dir%", "chestrefill.yml", "File");
    
            try {
                if(!getConfig().getString("ConfigStatus").equals("UXVlc3RvUGx1Z2luw6hkaU1pY2hlbGU=")) {
                    try {
                        YamlConfiguration.loadConfiguration(LangIT).options().copyDefaults(true);
                        YamlConfiguration.loadConfiguration(LangEN).options().copyDefaults(true);
                        saveResource( "lang" + File.separator + LangIT.getName(), true);
                        saveResource( "lang" + File.separator + LangEN.getName(), true);
                        getConfig().set("ConfigStatus", "UXVlc3RvUGx1Z2luw6hkaU1pY2hlbGU=");
                        saveConfig();
                    } catch (Exception e) {
                        e.printStackTrace();
                        getConfig().set("ConfigStatus", "Reset");
                        saveConfig();
                    }
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    
        private void saveResource(String s, boolean b) {
        }
    
        private void saveConfig() {
        }
    
        private ResultSet getConfig() {
            // your code
            return null;
        }
    
        private void createDir(String s, String lang, String dir) {
            // your code
        }
    
        private File getDataFolder() {
            return new File("/exampleFolder/");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      相关资源
      最近更新 更多