4

コードの繰り返しを避けるという長年の疑問に対して、私は少し異なる見方をしていると思います。セットアップは非常に標準的です。同様のアクションを実行する一連の if ステートメントです。以下に簡単な例を示します。

コードの効率、コンパクトさ、およびプログラマーの容易さの観点から、このような状況に対処するための最良の方法を見つけようとしています。1 つのソリューションが 3 つすべてに当てはまるとは思えないため、これらの各ポイントに対処する個別のソリューションは問題なく、実際に好ましいことに注意してください。

たとえば、思いついた解決策の 1 つは、特に Android のようなモバイル デバイスでは、見苦しく遅いように思えます。また、変数がインスタンス変数である場合にのみ機能し、単なるローカル (場合)。このアイデアには、初期化式が二重ブレース初期化を使用して、関係する変数に対応する文字列でハッシュマップを埋める for ステートメントが含まれていました (たとえば、「installText」は「installPermission」にマップされます)。以下の -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% 確信がある場合、文字列値はこれら 3 つのいずれかになります。次に、次のようにします。

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 に答える