语法糖甜不甜?巧用枚举实现“状态”转换限制

语法糖

语法糖(Syntactic sugar),也被译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。——摘抄自百度百科

本质上,JVM 并不支持语法糖,语法糖只存在于 编译期。当编译器将 .java 源文件编译成 .class 字节码文件时,会进行 解语法糖的操作,来还原最原始的基础语法结构。

我们所熟悉的编程语言中几乎都会包含语法糖,当然 JAVA 也不例外。JAVA 中的语法糖包含 条件编译断言switch 支持 String 与枚举可变参数自动装箱/拆箱枚举内部类泛型擦除增强for循环lambda表达式try-with-resources等等。今天我们先来了解下 枚举

枚举类

JDK5 提供了一种新的特殊的类——枚举类,一般在类对象有限且固定的场景下使用,用来替代类中定义常量的方式。枚举相较于常量更加直观且类型安全。

枚举类的使用非常简单,用 enum 关键字来定义,多个枚举变量直接用逗号隔开。我们先来定义一个简单的枚举类 OrderStatus.java

<span class="hljs-keyword">public</span>&#xA0;<span class="hljs-keyword">enum</span>&#xA0;OrderStatus&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;NO_PAY,&#xA0;PAY,&#xA0;REFUNDING,&#xA0;REFUNDED,&#xA0;FAIL_REFUNDED,&#xA0;;<br>}

在其他类中使用 enum 变量的时候,只需要【类名.变量名】就可以了,和使用静态变量一样。另外,枚举类型可以确保 JVM 中仅存在 一个常量实例,所以我们可以放心的使用” ==”来比较两个变量。

注意事项:

我们可以先通过 javac 命令或者 IDEA 的编译功能将 OrderStatus.java 编译为 OrderStatus.class 字节码文件,然后用 DJ Java Decompiler 反编译器对 .class 文件进行反编译。

如果需要 DJ Java Decompiler 反编译器的小伙伴可以 私信阿Q获取!

<span class="hljs-keyword">public</span>&#xA0;<span class="hljs-keyword">final</span>&#xA0;<span class="hljs-class"><span class="hljs-keyword">class</span>&#xA0;<span class="hljs-title">OrderStatus</span>&#xA0;<span class="hljs-keyword">extends</span>&#xA0;<span class="hljs-title">Enum</span><br></span>{<br><br>&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">public</span>&#xA0;<span class="hljs-keyword">static</span>&#xA0;OrderStatus[]&#xA0;values()<br>&#xA0;&#xA0;&#xA0;&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">return</span>&#xA0;(OrderStatus[])$VALUES.clone();<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br><br>&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-function"><span class="hljs-keyword">public</span>&#xA0;<span class="hljs-keyword">static</span>&#xA0;OrderStatus&#xA0;<span class="hljs-title">valueOf</span><span class="hljs-params">(String&#xA0;name)</span><br>&#xA0;&#xA0;&#xA0;&#xA0;</span>{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">return</span>&#xA0;(OrderStatus)Enum.valueOf(com/itcast/java/enumpack/OrderStatus,&#xA0;name);<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br><br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-function"><span class="hljs-keyword">private</span>&#xA0;<span class="hljs-title">OrderStatus</span><span class="hljs-params">(String&#xA0;s,&#xA0;<span class="hljs-keyword">int</span>&#xA0;i)</span><br>&#xA0;&#xA0;&#xA0;&#xA0;</span>{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">super</span>(s,&#xA0;i);<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br><br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">public</span>&#xA0;<span class="hljs-keyword">static</span>&#xA0;<span class="hljs-keyword">final</span>&#xA0;OrderStatus&#xA0;NO_PAY;<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">public</span>&#xA0;<span class="hljs-keyword">static</span>&#xA0;<span class="hljs-keyword">final</span>&#xA0;OrderStatus&#xA0;PAY;<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">public</span>&#xA0;<span class="hljs-keyword">static</span>&#xA0;<span class="hljs-keyword">final</span>&#xA0;OrderStatus&#xA0;REFUNDING;<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">public</span>&#xA0;<span class="hljs-keyword">static</span>&#xA0;<span class="hljs-keyword">final</span>&#xA0;OrderStatus&#xA0;REFUNDED;<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">public</span>&#xA0;<span class="hljs-keyword">static</span>&#xA0;<span class="hljs-keyword">final</span>&#xA0;OrderStatus&#xA0;FAIL_REFUNDED;<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">private</span>&#xA0;<span class="hljs-keyword">static</span>&#xA0;<span class="hljs-keyword">final</span>&#xA0;OrderStatus&#xA0;$VALUES[];<br><br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">static</span>&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;NO_PAY&#xA0;=&#xA0;<span class="hljs-keyword">new</span>&#xA0;OrderStatus(<span class="hljs-string">"NO_PAY"</span>,&#xA0;<span class="hljs-number">0</span>);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;PAY&#xA0;=&#xA0;<span class="hljs-keyword">new</span>&#xA0;OrderStatus(<span class="hljs-string">"PAY"</span>,&#xA0;<span class="hljs-number">1</span>);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;REFUNDING&#xA0;=&#xA0;<span class="hljs-keyword">new</span>&#xA0;OrderStatus(<span class="hljs-string">"REFUNDING"</span>,&#xA0;<span class="hljs-number">2</span>);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;REFUNDED&#xA0;=&#xA0;<span class="hljs-keyword">new</span>&#xA0;OrderStatus(<span class="hljs-string">"REFUNDED"</span>,&#xA0;<span class="hljs-number">3</span>);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;FAIL_REFUNDED&#xA0;=&#xA0;<span class="hljs-keyword">new</span>&#xA0;OrderStatus(<span class="hljs-string">"FAIL_REFUNDED"</span>,&#xA0;<span class="hljs-number">4</span>);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;$VALUES&#xA0;=&#xA0;(<span class="hljs-keyword">new</span>&#xA0;OrderStatus[]&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;NO_PAY,&#xA0;PAY,&#xA0;REFUNDING,&#xA0;REFUNDED,&#xA0;FAIL_REFUNDED<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;});<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br>}

如源码所示:

  • 编译器会自动帮我们创建一个 final 类型的类继承 Enum 类,所以枚举类不能被继承。
  • 会自动生成 私有 构造方法,当然我们也可以定义构造方法,但必须是私有的,这样就不能在别处声明此类的对象了。
  • 枚举项会被自动添加 public static final 修饰,并定义为 OrderStatus 类型,并在 静态代码块 中被初始化。
  • 并提供了 values()valueOf(String name) 的静态方法。

我们定义的枚举变量实际上是编译器帮我们自动生成了构造函数。

所有枚举类都是 Enum 的子类,枚举类可以实现一个或多个接口。

Enum 是所有 Java 语言枚举类型的公共基类,实现了 Comparable 和 Serializable 接口。它包含 final 类型的 name 和 ordinal (此枚举常量的序号,从0开始)属性,下面我们来了解下它的方法

  • protected Enum(String name, int ordinal);——构造方法;
  • public String toString();——返回 name 字段,即枚举定义枚举变量的字符串;
  • protected final Object clone();——抛出 CloneNotSupportedException 异常,保证枚举类永远不会被克隆;
  • public final Class getDeclaringClass();——返回与此枚举常量的枚举类型对应的类对象;
  • protected final void finalize();—— 枚举类不能有 finalize 方法;
  • readObject(ObjectInputStream in);& readObjectNoData();—— 抛出InvalidObjectException 异常,防止默认反序列化;

枚举类也可以有抽象方法,但是枚举项必须重写该方法。

<br><span class="hljs-keyword">public</span>&#xA0;<span class="hljs-class"><span class="hljs-keyword">interface</span>&#xA0;<span class="hljs-title">Order</span>&#xA0;</span>{<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-function"><span class="hljs-keyword">void</span>&#xA0;<span class="hljs-title">printOrderStatus</span><span class="hljs-params">()</span></span>;<br>}<br><br><br><span class="hljs-keyword">public</span>&#xA0;<span class="hljs-keyword">enum</span>&#xA0;OrderStatus&#xA0;implements&#xA0;Order{<br>&#xA0;&#xA0;&#xA0;&#xA0;NO_PAY(<span class="hljs-string">"&#x672A;&#x652F;&#x4ED8;"</span>,<span class="hljs-number">0</span>){<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-function"><span class="hljs-keyword">public</span>&#xA0;<span class="hljs-keyword">void</span>&#xA0;<span class="hljs-title">printOrderStatus</span><span class="hljs-params">()</span>&#xA0;</span>{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;System.out.println(<span class="hljs-string">"&#x672A;&#x652F;&#x4ED8;"</span>);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;},<br>&#xA0;&#xA0;&#xA0;&#xA0;PAY(<span class="hljs-string">"&#x5DF2;&#x652F;&#x4ED8;"</span>,<span class="hljs-number">1</span>){<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-function"><span class="hljs-keyword">public</span>&#xA0;<span class="hljs-keyword">void</span>&#xA0;<span class="hljs-title">printOrderStatus</span><span class="hljs-params">()</span>&#xA0;</span>{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;System.out.println(<span class="hljs-string">"&#x5DF2;&#x652F;&#x4ED8;"</span>);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;},<br>&#xA0;&#xA0;&#xA0;&#xA0;REFUNDING(<span class="hljs-string">"&#x9000;&#x6B3E;&#x4E2D;"</span>,<span class="hljs-number">2</span>){<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-function"><span class="hljs-keyword">public</span>&#xA0;<span class="hljs-keyword">void</span>&#xA0;<span class="hljs-title">printOrderStatus</span><span class="hljs-params">()</span>&#xA0;</span>{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;System.out.println(<span class="hljs-string">"&#x9000;&#x6B3E;&#x4E2D;"</span>);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;},<br>&#xA0;&#xA0;&#xA0;&#xA0;REFUNDED(<span class="hljs-string">"&#x9000;&#x6B3E;&#x6210;&#x529F;"</span>,<span class="hljs-number">3</span>){<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-function"><span class="hljs-keyword">public</span>&#xA0;<span class="hljs-keyword">void</span>&#xA0;<span class="hljs-title">printOrderStatus</span><span class="hljs-params">()</span>&#xA0;</span>{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;System.out.println(<span class="hljs-string">"&#x9000;&#x6B3E;&#x6210;&#x529F;"</span>);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;},<br>&#xA0;&#xA0;&#xA0;&#xA0;FAIL_REFUNDED(<span class="hljs-string">"&#x9000;&#x6B3E;&#x5931;&#x8D25;"</span>,<span class="hljs-number">4</span>){<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-function"><span class="hljs-keyword">public</span>&#xA0;<span class="hljs-keyword">void</span>&#xA0;<span class="hljs-title">printOrderStatus</span><span class="hljs-params">()</span>&#xA0;</span>{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;System.out.println(<span class="hljs-string">"&#x9000;&#x6B3E;&#x5931;&#x8D25;"</span>);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;},<br>&#xA0;&#xA0;&#xA0;&#xA0;;<br><br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">private</span>&#xA0;<span class="hljs-keyword">final</span>&#xA0;String&#xA0;name;<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">private</span>&#xA0;<span class="hljs-keyword">final</span>&#xA0;<span class="hljs-keyword">int</span>&#xA0;status;<br><br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-function"><span class="hljs-keyword">private</span>&#xA0;<span class="hljs-title">OrderStatus</span><span class="hljs-params">(String&#xA0;name,<span class="hljs-keyword">int</span>&#xA0;status)</span></span>{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">this</span>.name&#xA0;=&#xA0;name;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">this</span>.status&#xA0;=&#xA0;status;<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br>}

此时查看编译后的文件,会发现除了生成 OrderStatus.class 文件之外,还生成了多个 .class 文件:

它们是 OrderStatus.class 中生成的匿名内部类的文件。

状态转换

订单是电商项目中不可缺少的组成部分,而订单状态的转换也是我们经常讨论的问题。我们都知道订单状态的转换是有一定的逻辑性的,不可以随意转换。

:你想购买某个商品,只是把它加入了购物车,此时应该是 未支付状态。如果来个请求想把它转换为 退款状态,那么系统应该抛出提示信息”状态转换失败,请先完成购买!”

接下来我们就用 枚举来完成一下订单状态转换的限制。

枚举类定义:

<span class="hljs-keyword">public</span>&#xA0;<span class="hljs-keyword">enum</span>&#xA0;OrderStatus{<br>&#xA0;&#xA0;&#xA0;&#xA0;NO_PAY(<span class="hljs-string">"&#x672A;&#x652F;&#x4ED8;"</span>,<span class="hljs-number">0</span>){<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-function"><span class="hljs-keyword">public</span>&#xA0;Boolean&#xA0;<span class="hljs-title">canChange</span><span class="hljs-params">(OrderStatus&#xA0;orderStatus)</span>&#xA0;</span>{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">switch</span>&#xA0;(orderStatus){<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">case</span>&#xA0;PAY:<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">return</span>&#xA0;<span class="hljs-keyword">true</span>;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">default</span>:<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">return</span>&#xA0;<span class="hljs-keyword">false</span>;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;},<br>&#xA0;&#xA0;&#xA0;&#xA0;PAY(<span class="hljs-string">"&#x5DF2;&#x652F;&#x4ED8;"</span>,<span class="hljs-number">1</span>){<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-function"><span class="hljs-keyword">public</span>&#xA0;Boolean&#xA0;<span class="hljs-title">canChange</span><span class="hljs-params">(OrderStatus&#xA0;orderStatus)</span>&#xA0;</span>{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">switch</span>&#xA0;(orderStatus){<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">case</span>&#xA0;REFUNDING:<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">return</span>&#xA0;<span class="hljs-keyword">true</span>;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">default</span>:<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">return</span>&#xA0;<span class="hljs-keyword">false</span>;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;},<br>&#xA0;&#xA0;&#xA0;&#xA0;REFUNDING(<span class="hljs-string">"&#x9000;&#x6B3E;&#x4E2D;"</span>,<span class="hljs-number">2</span>){<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-function"><span class="hljs-keyword">public</span>&#xA0;Boolean&#xA0;<span class="hljs-title">canChange</span><span class="hljs-params">(OrderStatus&#xA0;orderStatus)</span>&#xA0;</span>{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">switch</span>&#xA0;(orderStatus){<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">case</span>&#xA0;REFUNDED:<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">case</span>&#xA0;FAIL_REFUNDED:<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">return</span>&#xA0;<span class="hljs-keyword">true</span>;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">default</span>:<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">return</span>&#xA0;<span class="hljs-keyword">false</span>;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;},<br>&#xA0;&#xA0;&#xA0;&#xA0;REFUNDED(<span class="hljs-string">"&#x9000;&#x6B3E;&#x6210;&#x529F;"</span>,<span class="hljs-number">3</span>),<br>&#xA0;&#xA0;&#xA0;&#xA0;FAIL_REFUNDED(<span class="hljs-string">"&#x9000;&#x6B3E;&#x5931;&#x8D25;"</span>,<span class="hljs-number">4</span>),<br>&#xA0;&#xA0;&#xA0;&#xA0;;<br><br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">private</span>&#xA0;<span class="hljs-keyword">final</span>&#xA0;String&#xA0;name;<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">private</span>&#xA0;<span class="hljs-keyword">final</span>&#xA0;<span class="hljs-keyword">int</span>&#xA0;status;<br><br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-function"><span class="hljs-keyword">private</span>&#xA0;<span class="hljs-title">OrderStatus</span><span class="hljs-params">(String&#xA0;name,<span class="hljs-keyword">int</span>&#xA0;status)</span></span>{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">this</span>.name&#xA0;=&#xA0;name;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">this</span>.status&#xA0;=&#xA0;status;<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br><br>&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-function"><span class="hljs-keyword">public</span>&#xA0;Boolean&#xA0;<span class="hljs-title">canChange</span><span class="hljs-params">(OrderStatus&#xA0;orderStatus)</span></span>{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">return</span>&#xA0;<span class="hljs-keyword">false</span>;<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br>}

调用方法:

<span class="hljs-keyword">public</span>&#xA0;<span class="hljs-class"><span class="hljs-keyword">class</span>&#xA0;<span class="hljs-title">EnumTest</span>&#xA0;</span>{<br><br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-function"><span class="hljs-keyword">public</span>&#xA0;<span class="hljs-keyword">static</span>&#xA0;<span class="hljs-keyword">void</span>&#xA0;<span class="hljs-title">main</span><span class="hljs-params">(String[]&#xA0;args)</span>&#xA0;</span>{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;Boolean&#xA0;aBoolean&#xA0;=&#xA0;OrderStatus.NO_PAY.canChange(OrderStatus.PAY);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;String&#xA0;statusStr&#xA0;=&#xA0;aBoolean?<span class="hljs-string">"&#x53EF;&#x4EE5;"</span>:<span class="hljs-string">"&#x4E0D;&#x53EF;&#x4EE5;"</span>;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;System.out.println(<span class="hljs-string">"&#x662F;&#x5426;&#x53EF;&#x4EE5;&#x5B8C;&#x6210;&#x72B6;&#x6001;&#x8F6C;&#x6362;&#xFF1A;"</span>+&#xA0;statusStr);<br><br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;Boolean&#xA0;flag&#xA0;=&#xA0;OrderStatus.REFUNDED.canChange(OrderStatus.FAIL_REFUNDED);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;String&#xA0;flagStr&#xA0;=&#xA0;flag?<span class="hljs-string">"&#x53EF;&#x4EE5;"</span>:<span class="hljs-string">"&#x4E0D;&#x53EF;&#x4EE5;"</span>;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;System.out.println(<span class="hljs-string">"&#x662F;&#x5426;&#x53EF;&#x4EE5;&#x5B8C;&#x6210;&#x72B6;&#x6001;&#x8F6C;&#x6362;&#xFF1A;"</span>+&#xA0;flagStr);<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br>}

返回结果:

这样我们就用枚举类实现了订单状态转换的限制。此例子只是为状态转换提供一种 思路,具体的流程还需要根据自己系统中的业务来具体处理。

如果你有不同的意见或者更好的 idea,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!

Original: https://www.cnblogs.com/aqsaycode/p/15406956.html
Author: 阿Q说代码
Title: 语法糖甜不甜?巧用枚举实现“状态”转换限制

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570008/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球