精选枚举代替开关
問題及其解決方案
開關/案例是用大多數命令式編程語言實現的通用控制結構。 開關比一系列的if / else更具可讀性。
這是一個簡單的示例:
// Switch with int literal switch (c) {case 1: one(); break;case 2: two(); break;case 3: three(); break;default: throw new UnsupportedOperationException(String.format("Operation %d is not supported", c)); }這是此代碼中的主要問題的列表:
最簡單的解決方法是使用int常量而不是文字。 首先,讓我們定義常量:
private static int ONE = 1; private static int TWO = 2; private static int THREE = 3;現在,代碼將如下所示:
switch (c) {case ONE: one(); break;case TWO: two(); break;case THREE: three(); break;default: throw new UnsupportedOperationException(String.format("Operation %d is not supported", c)); } (顯然,在現實生活中,常量的名稱必須是自描述的)
此代碼段更具可讀性,但所有其他缺點仍然相關。 改進初始代碼段的下一個嘗試使用2004年在版本5中引入Java語言的enums 。讓我們定義以下enum :
現在,開關片段將稍作更改:
Action a = ... switch (a) {case ONE: one(); break;case TWO: two(); break;case THREE: three(); break;default: throw new UnsupportedOperationException(String.format("Operation %s is not supported", a)); }這段代碼要好一點:如果從enum Action刪除其中一個元素,它將產生編譯錯誤。 但是,如果將其他元素添加到enum Action ,則不會導致編譯錯誤。 在這種情況下,某些IDE或靜態代碼分析工具可能會產生警告,但是誰在注意警告呢? 幸運的是, enum可以聲明必須由每個元素實現的抽象方法:
enum Action {ONE { @Override public void action() { } }, TWO { @Override public void action() { } }, THREE { @Override public void action() { } }, public abstract void action(); }現在,switch語句可以用單行替換:
Action a = ... a.action();此解決方案沒有上面列舉的任何缺點:
結論
盡管開關/外殼結構是眾所周知的,并且以各種編程語言廣泛使用,但是其使用可能會引起很多問題。 上面描述的使用Java枚舉的解決方案沒有這些缺點。 本系列的下一篇文章展示了如何擴展現有enum功能。
翻譯自: https://www.javacodegeeks.com/2019/03/featured-enum-instead-switch.html
總結
- 上一篇: 骆驼祥子大事件时间轴_骆驼中的事件处理
- 下一篇: 休眠多对多教程