在if语句中绕过类似变量的重复

时间:2012-07-11 14:31:15

标签: java android loops reflection

我认为我对避免重复代码的长期问题提出了一个略微不同的看法。设置是相当标准的 - 一堆if语句采取类似的行动。下面你会找到一个简短的例子。

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

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

我怎样才能更好地做到这一点?提前感谢您的时间和建议!

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

3 个答案:

答案 0 :(得分: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;  
}

答案 1 :(得分: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);
}

此外,ENABLEDDISABLEDDEFAULT应简单地定义为您班级中的常量:

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

然而,我仍然没有用反思来理解你的想法......?我在这里没有必要,除非你有一个用例,你的代码目前还没有显示......?

答案 2 :(得分: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);

欢呼声