4

我相信我对避免代码重复的长期问题提出了稍微不同的看法。设置是相当标准的——一堆 if 语句采取类似的行动。您将在下面找到一个简短的示例。

在代码效率、紧凑性和程序员易用性方面,我试图找出解决此类情况的最佳方法。请注意,解决这些问题的单独解决方案很好,确实更可取,因为我怀疑一个解决方案会同时满足所有三个问题。

例如,想到的一种可能的解决方案似乎笨拙而缓慢,尤其是在像 android 这样的移动设备上,而且它只有在变量是实例变量时才有效,而不仅仅是本地变量(这很可能是案子)。这个想法涉及一个 for 语句,其初始化表达式将使用双括号初始化来用与所涉及的变量相对应的字符串填充哈希映射(例如,“installText”映射到“installPermission”),然后 for 循环将包含一个 if- -else-if--else-if 子句,它将使用反射通过存储在哈希图中的变量名称来访问变量。

我怎样才能做得更好?提前感谢您的时间和建议!

if (installText.equals("Default")) {
    installPermission = DEFAULT;
} else if (installText.equals("Allow")) {
    installPermission = ENABLED;
} else if (installText.equals("Disallow")) {
    installPermission = DISABLED;
}
if (uninstallText.equals("Default")) {
    uninstallPermission = DEFAULT;
} else if (uninstallText.equals("Allow")) {
    uninstallPermission = ENABLED;
} else if (uninstallText.equals("Disallow")) {
    uninstallPermission = DISABLED;
}
if (runText.equals("Default")) {
    runPermission = DEFAULT;
} else if (runText.equals("Allow")) {
    runPermission = ENABLED;
} else if (runText.equals("Disallow")) {
    runPermission = DISABLED;
}
4

3 回答 3

2

您使用的是 Java 7 吗?在这种情况下,您可以使用switch现在支持String值的语句:

switch(installText) {
    case "Allow":
        installPermission = ENABLED;
        break;
    case "Disallow":
        installPermission = DISABLED;
        break;
    case "Default":
        installPermission = DEFAULT;
        break;  
    default:
        installPermission = DEFAULT;
        break;  
}
于 2012-07-11T14:34:16.203 回答
1

将值检查提取到一个单独的方法(我正在重新使用 Simeon Visser 的部分答案并进行改进):

public String getPermission(String permission)
{
    String state = null;

    // If this is Java 7:
    /*
    switch(permission)
    {
        case "Allow":
             state = ENABLED;
             break;
        case "Disallow":
             state = DISABLED;
             break;
        case "Default":
        default:
             state = DEFAULT;
             break;  
    }
    */

    // If this is Java < 7:
    if (permission.equalsIgnoreCase("allow"))
        state = ENABLED;
    else if (permission.equalsIgnoreCase("disallow"))
        state = DISABLED;
    else
        state = DEFAULT;

    return state;
}

public void callingMethod(String permission)
{
     installPermission = getPermissionState(permission);
     uninstallPermission = getPermissionState(permission);
     runPermission = getPermissionState(permission);
}

此外,ENABLEDDISABLED应该DEFAULT简单地定义为您的类中的常量:

public static final String ENABLED = "ENABLED";
public static final String DISABLED = "DISABLED";
public static final String DEFAULT = "DEFAULT";

但是,我仍然无法通过反射来理解您的想法……?我认为这里没有必要,除非您有一个用例,其代码目前没有显示......?

于 2012-07-11T14:42:11.327 回答
1

如果您 100% 确定,则字符串值将是这三个值之一。那么你可以这样做:

Map<String,String> map;
map.put("Default", "Default");
map.put("Allow", "Allow");
map.put("Disallow", "Disallow");
installPermission = map.get(installText);
uninstallPermission = map.get(uninstallText);
runPermission = map.get(runText);

干杯

于 2012-07-11T15:41:19.933 回答