Java 如何重写此方法以删除多余的if语句?

Java 如何重写此方法以删除多余的if语句?,java,performance,Java,Performance,如何重写此方法以最大限度地提高代码效率并最小化代码长度 注意:标题是之前定义的常量 private static URL getURL(String OS, String type, String size) { String prefix = ""; String prefixLarge = ""; if (type.equals("image")) { prefix = HEADER + "/image";

如何重写此方法以最大限度地提高代码效率并最小化代码长度

注意
标题
是之前定义的常量

private static URL getURL(String OS, String type, String size) {
        String prefix = "";
        String prefixLarge = "";
        if (type.equals("image")) {
            prefix = HEADER + "/image";
            prefixLarge = HEADER + "/image_large";
        } else {
            prefix = HEADER + "/file";
            prefixLarge = HEADER + "/file_raw";
        }
        String suffix = ".zip";
        String url = "";
        if (OS.contains("Win7.32bit")) {
            // win7-32bit system
            url = prefix + "Win7.32bit" + suffix;
            if (size.contains("origin")) {
                url = prefixLarge + "Win7.32bit" + suffix;
            }
        } else if (OS.contains("Win7.64bit")) {
            // win7-64bit system
            url = prefix + "Win7.64bit" + suffix;
            if (size.contains("origin")) {
                url = prefixLarge + "Win7.64bit" + suffix;
            }
        } else if (OS.contains("WinXP")) {
            // winxp-32bit system
            url = prefix + "WinXP" + suffix;
            if (size.contains("origin")) {
                url = prefixLarge + "WinXP" + suffix;
            }
        } else if (OS.contains("WinXP.64bit")) {
            // winxp-64bit system
            url = prefix + "WinXP.64bit" + suffix;
            if (size.contains("origin")) {
                url = prefixLarge + "WinXP.64bit" + suffix;
            }
        } else if (OS.contains("10.04")) {
            // ubuntu10.04 system
            url = prefix + "ubuntu10.04" + suffix;
            if (size.contains("origin")) {
                url = prefixLarge + "ubuntu10.04" + suffix;
            }
        } else if (OS.contains("12.04")) {
            // ubuntu12.04 system
            url = prefix + "ubuntu12.04" + suffix;
            if (size.contains("origin")) {
                url = prefixLarge + "ubuntu12.04" + suffix;
            }
        }
        return url;
    }

创建一个包含所有操作系统名称的
字符串数组。然后使用
for
循环迭代该数组

像这样:

String[]osNames={“Win7.32位”、“Win7.64位”、“10.04位”};
字符串[]osTypes={“Win7.32位”、“Win7.64位”、“ubuntu10.04”};
for(int i=0;i
这是要删除if-else条件的代码的一部分。注意break语句

private static Map osMap=new HashMap();
    private static Map <String, String> osMap = new HashMap<String, String>();
    static {
      osMap.put("Win7.32bit", "Win7.32bit");
      osMap.put("Win7.64bit", "Win7.64bit");
      osMap.put("WinXP", "WinXP");
      osMap.put("WinXP.64bit", "WinXP.64bit");
      osMap.put("10.04", "ubuntu10.04");
      osMap.put("12.04", "ubuntu12.04");
    }

    private static URL getURL(String os, String type, String size) {
        String prefix = "";
        String prefixLarge = "";
        if (type.equals("image")) {
            prefix = HEADER + "/image";
            prefixLarge = HEADER + "/image_large";
        } else {
            prefix = HEADER + "/file";
            prefixLarge = HEADER + "/file_raw";
        }
        String suffix = ".zip";
        String url = "";
        String systemType = "";

        for(String key : osMap.keySet()) {
           if(os.contains(key) {           
              url = prefix + osMap.get(key) + suffix;
              if (size.contains("origin")) {
                url = prefixLarge + osMap.get(key) + suffix;
              }
              break;
           }
        }
        return url;
 }
静止的{ put(“Win7.32位”、“Win7.32位”); put(“Win7.64位”、“Win7.64位”); osMap.put(“WinXP”、“WinXP”); put(“WinXP.64位”、“WinXP.64位”); osMap.put(“10.04”、“ubuntu10.04”); osMap.put(“12.04”、“ubuntu12.04”); } 私有静态URL getURL(字符串操作系统、字符串类型、字符串大小){ 字符串前缀=”; 字符串前缀arge=“”; if(type.equals(“image”)){ 前缀=标题+“/image”; prefixLarge=标题+“/image\u large”; }否则{ 前缀=头+“/文件”; prefixLarge=HEADER+“/file\u raw”; } 字符串后缀=“.zip”; 字符串url=“”; 字符串systemType=“”; for(字符串键:osMap.keySet()){ 如果(os.contains)(key){ url=前缀+osMap.get(key)+后缀; if(尺寸包含(“原点”)){ url=prefixLarge+osMap.get(key)+后缀; } 打破 } } 返回url; }
你考虑过使用switch吗?@KyelJmD我认为
switch
在这种情况下不起作用。@smit@KyelJmD…但是
在switch语句中包含
?对此表示怀疑。@MoritzPetersen正要评论同样的事情。@MoritzPetersen@Pankaj,你们是对的,只是想指出
jdk7
允许
字符串在s中witch
也许他发现url的结构不完全相同。比较
ubuntu12.10
12.10
。然而,我是其中一个投票人:)嗯,可能是这样,如果是这样,你需要再添加2-3行代码。但我们也应该给实际的开发人员留下一些东西将
String[]osNames
替换为
Map-osSubstringToFullName
,你就开始工作了是的,我在提交这篇文章后才看到Moritz的答案-基本上是一样的,但使用的是Map而不是并行数组;首先,我认为我将实现留给to,但后来我看到了其他实现尝试,并决定提供我自己的;-)+1因为与并行阵列相比,我更喜欢map方法。并行阵列总是有失步的风险,特别是如果添加了更多的操作系统和版本,这真是一项糟糕的工作。帽子可以激发你的想象力和创造力。还有改进的余地,例如使用
StringBuilder
而不是
String
。连接URL类似于(意味着:没有那么多临时变量)。可以使用
贴图
或其他类型的关联对象,而不是并行数组。我的意图是向您展示如何消除许多代码重复。我认为在Java中,保持低代码冗余比首先优化性能更重要。
    private static Map <String, String> osMap = new HashMap<String, String>();
    static {
      osMap.put("Win7.32bit", "Win7.32bit");
      osMap.put("Win7.64bit", "Win7.64bit");
      osMap.put("WinXP", "WinXP");
      osMap.put("WinXP.64bit", "WinXP.64bit");
      osMap.put("10.04", "ubuntu10.04");
      osMap.put("12.04", "ubuntu12.04");
    }

    private static URL getURL(String os, String type, String size) {
        String prefix = "";
        String prefixLarge = "";
        if (type.equals("image")) {
            prefix = HEADER + "/image";
            prefixLarge = HEADER + "/image_large";
        } else {
            prefix = HEADER + "/file";
            prefixLarge = HEADER + "/file_raw";
        }
        String suffix = ".zip";
        String url = "";
        String systemType = "";

        for(String key : osMap.keySet()) {
           if(os.contains(key) {           
              url = prefix + osMap.get(key) + suffix;
              if (size.contains("origin")) {
                url = prefixLarge + osMap.get(key) + suffix;
              }
              break;
           }
        }
        return url;
 }
private static URL getURL(String OS, String type, String size) {

    return  HEADER
            +
            size.contains("origin") 
                            ? ((type.equals("image") ? "/image_large" : "/file_raw" ))
                            : ((type.equals("image") ? "/image" : "/file" )) 
            +
            OS.contains("Win7.32bit")   ? "Win7.32bit" :
            OS.contains("Win7.64bit")   ? "Win7.64bit" : 
            OS.contains("WinXP.64bit")  ? "WinXP.64bit" :       
            OS.contains("WinXP")        ? "WinXP" : 
            OS.contains("10.04")        ? "ubuntu10.04" : 
            OS.contains("12.04")        ? "ubuntu12.04" : 
            ""
            +
            ".zip";
}