2012-10-17 30 views
0

我想知道在這種情況下是否可以使用switch語句而不是if-else one。變量從JComboBoxes拍攝和處理的ActionEvent這裏:是否有可能用開關語句替換if-else作爲開關值?

public void actionPerformed(ActionEvent event) { 

    Object source = event.getSource(); 

    if (source == comboUnit) { 

     String unit = comboUnit.getSelectedItem().toString(); 

      if (unit.equals("Unit 1")) { 
      unitValue = Double.parseDouble(tfUnit.getText()); 
      valMeter = unitValue * defined1; 
      labelDesc.setText("Unit 1"); 
      convert(); 
     } 

     else if (unit.equals("Unit 2")) { 
      unitValue = Double.parseDouble(tfUnit.getText()); 
      valMeter = unitValue * defined2; 
      labelDesc.setText("Unit 2"); 
      convert(); 
     } 
(...) 

我試圖通過純粹的字符串作爲值,但沒有成功。你有什麼暗示應該怎麼做(如果甚至可能的話)?

+0

任何具體原因爲什麼你想要switch-case? –

+0

唯一的原因是使代碼更清晰。 – AbreQueVoy

+1

然後,如下面的dystroy所述,將所有常用代碼移動到if(source == comboUnit)條件的主位,並在if語句中使用'valmeter ='行('labelDesc.setText(unit );'將在通用代碼中工作) – mcalex

回答

3

的Java 7,您可以switchString秒。

但是他們說,如果有人餓了,最好是教他們如何釣魚,而不是給他們一條魚。從長遠來看。我得到的是你的代碼需要重構,是否使用switchenumerationsmaps是第二個。

你有太多重複的代碼做基本相同的事情。我指的是:

unitValue = Double.parseDouble(tfUnit.getText()); 
valMeter = unitValue * defined1; 
labelDesc.setText("Unit 1"); 
convert(); 

很明顯,因爲你使用乘以根據所使用的單位不同的因素,你需要評估單位對使用該因子的功能。用較少的數學術語來說,您需要的東西可以產生值爲defined1或,具體取決於提供的字符串。您已經有unit指的是您所在單位的「名稱」,您可以使用它。我將這個方法稱爲factor,返回一個單位名稱並返回一個Number(因爲它不跟隨您的示例,不管您是乘以某種整數還是實數)。我也假設你的defined1和等,是變量或文字。

unitValue = Double.parseDouble(tfUnit.getText()); 
valMeter = unitValue * factor(unit); 
labelDesc.setText(unit); 
convert(); 

Number factor(String unitName) 
{ 
    switch(unitName) 
    { 
     case "Unit 1": return defined1; 
     case "Unit 2": return defined2; 
     default: throw new Exception("Unknown unit"); 
    } 
} 

的方法本身就是你的「轉或不轉」的問題逐漸在你,如果你想免費使用map

Map<String, Number> unitNameValueMap = new HashMap<String, Number>(); 

unitNameValueMap.put("Unit 1", defined1); 
unitNameValueMap.put("Unit 2", defined2); 

Number factor(String unitName) 
{ 
    Number result = unitNameValueMap.get(unitName); 

    if(result == null) 
    { 
     throw new Exception("Unknown unit"); 
    } 

    return result; 
} 

或者你可以使用枚舉:

enum UnitValue 
{ 
    UNIT1(defined1), UNIT2(defined2); 

    final Number value; 

    private UnitValue(Number value) 
    { 
     this.value = value; 
    } 
} 

Number factor(String unitName) 
{ 
    return Enum.valueOf(UnitValue.class, "UNIT" + Integer.parseInt(unitName.substring(5)).value; 
} 

你甚至可以switch或使用地圖內的枚舉,它會給你很好的代碼的可讀性,以及。

您需要配置您的程序,看看是否需要switch爲基礎的解決方案或枚舉基於一個或一個基於地圖的一個。就目前的情況而言,你可以看到,基於enum的解決方案由於單元名稱,枚舉常量和值之間的關係而有點麻煩。如果有人可以使用枚舉做得更好,那就自然而然地拿自己的代碼。

通常情況下,最短的代碼是最好的,因爲它更容易閱讀和最經常瞭解。但要小心地圖 - 它們會比其他解決方案產生更多的開銷,所以我更喜歡在地圖數量較少而且密鑰較多的地方使用它們,而不是相反。

1

您可以使用Enum和替換字符串的枚舉值

public static void main(String[] args) { 
    Units unit = Units.Unit1; 
    switch (unit) { 
    case Unit1: 
     break; 
    case Unit2: 
     break; 
    } 
} 

enum Units { 
    Unit1, Unit2, 
} 

的Java 7,您可以Using Strings in switch Statements

1

你的意思是像

switch (unit) { 
case "Unit 1": 
    // do something 
    break; 

case "Unit 2": 

} 

是的,你可以從Java7開始。

但在你的情況下,你似乎並不需要切換和if/else。在這兩種情況下您都做同樣的事情:

String unit = comboUnit.getSelectedItem().toString(); 
unitValue = Double.parseDouble(tfUnit.getText()); 
valMeter = unitValue * defined1; 
labelDesc.setText(unit); 
convert(); 
+1

with java 7 only

+0

@dys:nahh,valmeter涉及defined1或defined2 – mcalex

+2

而不能更簡單地獲取它嗎?我建議至少把所有可以在開關外部放置的東西都留下,而只留下真正依賴於單元的代碼。 –