序言:java中enum中有一个有趣的特性,即可以为每一个enum实例编写方法,从而为每一个实例赋予不同的行为。
    一、常量相关方法:
    ①:每一个enum实例都有不同的方法行为。通常我们可以为enum定义一个或多个abstact方法,然后每个实例实现该方法。

    1. public enum ConstantSpecificMethod {
    2. DATE_TIME{
    3. @Override
    4. String getInfo() {
    5. return DateFormat.getDateInstance().format(new Date());//当前时间
    6. }
    7. },
    8. CLASSPATH{
    9. @Override
    10. String getInfo() {
    11. return System.getenv("CLASSPATH");//jdk文件
    12. }
    13. },
    14. VERSION{
    15. @Override
    16. String getInfo() {
    17. return System.getProperty("java.version");//java版本
    18. }
    19. };
    20. abstract String getInfo();
    21. public static void main(String[] args) {
    22. for (ConstantSpecificMethod value : ConstantSpecificMethod.values()) {
    23. System.out.println(value.getInfo());
    24. }
    25. }
    26. }
    27. //OutPut:
    28. 2021-5-10
    29. .;C:\Program Files\Java\jdk1.8.0_231\lib\;
    30. 1.8.0_231

    注意:enum实例不能当做一个真的类型来使用
    ②:普通的常量相关方法,eunm实例也可以覆盖

    1. public enum OverrideConstantSpecific {
    2. NUT,
    3. BOLT,
    4. WASHER{
    5. @Override
    6. void f() {
    7. System.out.println("override f()");
    8. }
    9. };
    10. void f(){
    11. System.out.println("f()");
    12. }
    13. public static void main(String[] args) {
    14. for (OverrideConstantSpecific value : OverrideConstantSpecific.values()) {
    15. value.f();
    16. }
    17. }
    18. }

    通过上面程序,我们可以看到,普通的方法enum实例也可以覆盖,如果没覆盖的实例,将会调用enum中的方法。
    二、enum职责链
    在职责链设计模式中,以多做方法来处理同一个问题,然后将他们连接到一起,当请求到达时候,他遍历整个链,找到对应的处理。
    通过常量相关的方法,可以很容易的实现一个职责链

    1. package com.package19;
    2. public class AskForLeave {
    3. enum Type {
    4. ill1, ill2, ill3;
    5. }
    6. enum Allow {
    7. S1 {
    8. @Override
    9. boolean handle(Type type) {
    10. switch (type) {
    11. case ill1:
    12. return false;
    13. case ill2:
    14. return true;
    15. case ill3:
    16. return true;
    17. default:
    18. return false;
    19. }
    20. }
    21. },
    22. T1 {
    23. @Override
    24. boolean handle(Type type) {
    25. switch (type) {
    26. case ill3:
    27. return true;
    28. default:
    29. return false;
    30. }
    31. }
    32. };
    33. abstract boolean handle(Type type);
    34. }
    35. void AskForLevae(Type type) {
    36. for (Allow value : Allow.values()) {
    37. boolean b = value.handle(type);
    38. System.out.println(value + "的处理结果为:" + b);
    39. if (!b) {
    40. System.out.println("该病假: " + type + " 不允许");
    41. return;
    42. }
    43. }
    44. System.out.println("愉快的请到假期");
    45. }
    46. public static void main(String[] args) {
    47. AskForLeave askForLeave = new AskForLeave();
    48. askForLeave.AskForLevae(Type.ill1);
    49. }
    50. }
    1. 上述请假的列子,就是使用了enum中的常量相关的方法实现了一个简单的职责链。