2012-07-11 19 views
4

我相信我對避免代碼重複這個常年性問題略有不同。該設置是相當標準的 - 一堆if語句採取類似的行動。下面你會找到一個簡短的例子。在if語句中繞過類似變量的重複

我試圖找出解決這種情況的最佳方法,就代碼效率,緊湊性和程序員而言。請注意,解決上述每個問題的單獨解決方案都很好,實際上更可取,因爲我懷疑一個解決方案會遇到這三個問題。

例如,想到的一種可能的解決方案似乎是不明智和緩慢的,特別是在像android這樣的移動設備上,加上它只會在變量是實例變量時才起作用,而不僅僅是局部的情況很好)。這個想法涉及到一個for語句,它的初始化表達式將使用雙括號初始化來填充與所涉及變量相對應的字符串(例如「installText」映射到「installPermission」)的hashmap,然後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; 
} 
+1

也許你可以使用一個'地圖<字符串,國家>':那麼你可以如下做到這一點?好像你所有的if語句都可以用'fooPermission = map.get(fooText)'來代替。 – Keppil 2012-07-11 14:58:13

+0

我其實很好奇爲什麼你的變量是以字符串爲基礎的。你能解釋一下你在這種情況下做了什麼嗎?我們可能會提供更好的解決方案和更多的信息。 – kcoppock 2012-07-11 15:47:10

回答

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

雖然我確實認爲交換機很好,但它仍然會使代碼不受影響。 – carlspring 2012-07-11 14:43:44

+0

但它是否需要縮短?代碼易讀,易於理解且易於擴展。我沒有看到有更多數據結構複雜化的理由,也沒有。 – 2012-07-11 14:45:57

+0

哦,真好,我沒有意識到與SE 7的增加。這在某些情況下肯定會有用,而且肯定比衆多的「ifs」更受歡迎,但仍有一些問題存在。假設交換機位於for循環內部,仍然存在使用適當的變量(安裝,卸載,運行等等,假設更多)替換「installText」和「installPermission」的問題。另外,雖然我從學術的角度來問我的問題,但我在使用android時遇到了靈感,所以在這裏沒有Java 7。雖然你的答案的內容明確感謝! – Walker 2012-07-11 14:49:22

1

提取值進行覈對,以一個單獨的方法(我重新使用西麥維瑟的回答與改進的部分):

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

但是,我仍然無法用思考來理解你的想法......?在這裏我不覺得有必要,除非你有一個用例,你的代碼目前沒有顯示......?

+0

Ahh是的,這對於處理多個變量來說當然是一個可行的選擇。把數據結構的複雜性從事情中排除出去。我仍然對這些替代方案和其他方法感興趣,因爲我將這個問題定位爲來自學術角度(儘管如我在對Simeon回答的評論中所指出的,靈感來自我正在從事的一個項目機器人)。感謝您的回答! – Walker 2012-07-11 14:54:46

+0

沒問題。儘管如此,你還是可以得到你喜歡的答案。 – carlspring 2012-07-11 14:59:29

+0

我已經更新了我的答案。 – carlspring 2012-07-11 15:04:43

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

歡呼