日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

精选枚举代替开关

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 精选枚举代替开关 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題及其解決方案

開關/案例是用大多數命令式編程語言實現的通用控制結構。 開關比一系列的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文字(1、2、3)與執行的代碼之間的關系并不明顯。
  • 如果不再支持其中一個值(例如2),并且此開關未相應更新,它將永遠包含未使用的代碼。
  • 如果引入了c的新可能值(例如4),并且未相應更新開關,則代碼可能會在運行時拋出UnsupportedOperationException而沒有任何編譯時通知。
  • 這種開關結構傾向于在代碼中重復幾次,從而使問題2和3更加復雜。
  • 最簡單的解決方法是使用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 :

    enum Action {ONE, TWO, THREE}

    現在,開關片段將稍作更改:

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

    此解決方案沒有上面列舉的任何缺點:

  • 這是可讀的。 該方法“附加”到enum元素。 如果方法含義不清楚,則可以編寫所需數量的javadoc 。 調用方法的代碼很簡單:什么比方法調用更簡單?
  • 在不刪除實現的情況下無法刪除enum常量,因此,如果某些功能不再相關,則不會保留任何未使用的代碼。
  • 如果沒有實現action()方法,則無法添加新的enum元素。 沒有實現的代碼無法編譯。
  • 如果需要執行多個操作,則可以在枚舉中全部執行。 正如我們已經提到的,調用特定功能的代碼是微不足道的,因此現在沒有代碼重復了。
  • 結論

    盡管開關/外殼結構是眾所周知的,并且以各種編程語言廣泛使用,但是其使用可能會引起很多問題。 上面描述的使用Java枚舉的解決方案沒有這些缺點。 本系列的下一篇文章展示了如何擴展現有enum功能。

    翻譯自: https://www.javacodegeeks.com/2019/03/featured-enum-instead-switch.html

    總結

    以上是生活随笔為你收集整理的精选枚举代替开关的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。