2016-07-25 86 views
-3

你好我正在嘗試創建一個Java程序,用戶可以輸入不同的命令,這個類可以識別所有命令,並基於它調用3-4個不同類的方法。目前每個命令我有if語句不同,因爲這樣的:在JAVA中if語句太多

if (input.equals("change category FOOD"){...} 
if (input.equals("Sort by price FOOD"){...} 
if (input.equals("logout"){...} 

有這麼多的命令,我想知道是否有縮短這件事的方式。

+2

也許。你需要告訴我們一些'{...}'部分的內容。 –

+1

你可以使用'switch/case'語句。或者某種命令模式的命令在'HashMap'中。 –

+1

使用'Map '來定義命令和表示要做什麼的對象('[something]'部分)之間的映射。既然你沒有告訴我們這些命令是什麼,我們就不能告訴你什麼是「什麼」。 –

回答

-1

那麼,首先,你要檢查每個if語句,每次你處理輸入。如果使用if/else以保持代碼更清潔和更高效

if (input.equals("Hi") { 
... 
} 
else if (input.equals("Hi") { 
... 
} 

等等。

您還要求輸入與半長字符串完全匹配。這種情況幾乎不會發生在實踐中,你應該要麼要求更短的參數,通過使用

String newString = string.split(" "); 

最後一件事的字符串分割成一個數組,只是儘量保持你的代碼儘可能乾淨。您很可能無法縮短支票,因此請保持您的代碼可讀性,並且不要將大量代碼放在一個地方。

+0

你爲什麼要這樣......? –

0

使用一個字符串switch語句自動實現string.equals方法:

switch(input) { 
     case "change category FOOD": 
      statement; 
      break; 
     case "Sort by price FOOD": 
      statement; 
      break; 
     case "logout": 
      statement; 
      break; 
     default: 
      statement; 
    } 

在哪裏「聲明」表示{...}你把你的問題。

當你的if/else語句開始堆積時,這是一個不錯的選擇。不要忘記添加default:的情況。如果沒有一個案例得到滿足,它將作爲最終的「其他」聲明。

0

要擴大@Jim駐軍的評論,

使用地圖,其中第一類是字符串,表示該命令,第二類是可以運行的類。如果你不需要任何命令,那麼使用Runnable,併爲每個命令編寫一個Runnable實現,並在一個設置函數中創建映射條目。

如果您需要更多信息,請創建n接口SomeInterface,它具有onCommand(...)方法,傳遞必要的數據。再次,爲每個命令添加一個實現,並將每個命令的映射添加到映射的command-runner。因此,運行正確的命令實現將只是

map.get(「command」)。onCommand(...);

+0

我試過了,但是這意味着它會創建很多類,並且有很多命令,所以很多類也是如此 –

+0

所以,你必須以這樣或那樣的方式去查看每個命令。無論採用哪種方法,從根本上來說,在某些情況下,您將會檢查一些可能的命令來檢查每個字符串。你所能做的就是儘量讓自己更易讀。分離到類中是一個相當可讀的手段,但它的確是你的編碼風格的決定因素。 – TheNumenorean

+0

哦好吧非常感謝你! –

0

創建Map<String,Function>

設置字符串鍵的命令和Function適當。

然後,您可以通過從地圖調用該函數來執行該函數。

+0

我會試一試 –

0

其他答案建議使用map這肯定是可行的。它有幾個潛在的缺點但是:

  • 你永遠侷限於equals以匹配操作的命令
  • ,您將需要一個單獨的地圖
  • 可能難以測試 - 例如嘲笑命令意味着暴露單例

封裝一組命令的可能替代方法是使用帶有可運行變量的enum。例如:

public enum Command { 
    CHANGE_CATEGORY("change category",() -> { 
     // change category 
    }), 
    SORT_BY_PRICE("sort by price",() -> { 
     // sort by price 
    }), 
    ... 
    DEFAULT("",() -> { 
     // default action 
    }); 

    private final String commandText; 
    private final Runnable action; 

    Command(String commandText, Runnable action) { 
     this.commandText = commandText; 
     this.action = action; 
    } 

    public static void run(String text) { 
     Arrays.stream(values()) 
      .filter(c -> c.commandText.equals(text)) 
      .findAny().orElse(DEFAULT) 
      .action.run(); 
    } 
} 

這將用作:Command.run(text)

這允許你把同在一個地方的命令相關聯的所有邏輯可以很容易地更改匹配文本的邏輯(例如忽略空格,情況)通過更改過濾器。這個枚舉也是一個單例,但是該語言正在處理初始化它的所有複雜性。