注解代替枚举_精选枚举代替开关
注解代替枚舉
問題及其解決方案
開關(guān)/案例是用大多數(shù)命令式編程語言實現(xiàn)的通用控制結(jié)構(gòu)。 開關(guān)比一系列的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;現(xiàn)在,代碼將如下所示:
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)); } (顯然,在現(xiàn)實生活中,常量的名稱必須是自描述的)
該代碼段更具可讀性,但所有其他缺點(diǎn)仍然相關(guān)。 改進(jìn)初始代碼段的下一個嘗試使用2004年在版本5中引入Java語言的enums 。讓我們定義以下enum :
現(xiàn)在,開關(guān)片段將稍作更改:
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刪除其中一個元素,它將產(chǎn)生編譯錯誤。 但是,如果將其他元素添加到enum Action ,則不會導(dǎo)致編譯錯誤。 在這種情況下,某些IDE或靜態(tài)代碼分析工具可能會產(chǎn)生警告,但是誰在注意警告呢? 幸運(yùn)的是, enum可以聲明必須由每個元素實現(xiàn)的抽象方法:
enum Action {ONE { @Override public void action() { } }, TWO { @Override public void action() { } }, THREE { @Override public void action() { } }, public abstract void action(); }現(xiàn)在,switch語句可以用單行替換:
Action a = ... a.action();此解決方案沒有上面列舉的任何缺點(diǎn):
結(jié)論
盡管開關(guān)/外殼結(jié)構(gòu)是眾所周知的,并且以各種編程語言廣泛使用,但是其使用可能會引起很多問題。 上面描述的使用Java枚舉的解決方案沒有這些缺點(diǎn)。 本系列的下一篇文章展示了如何擴(kuò)展現(xiàn)有enum功能。
翻譯自: https://www.javacodegeeks.com/2019/03/featured-enum-instead-switch.html
注解代替枚舉
總結(jié)
以上是生活随笔為你收集整理的注解代替枚举_精选枚举代替开关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哔咔安卓2.2.1.2.3.4版 (官方
- 下一篇: jdk12 jdk1.8_JDK 12的