好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java 利用枚举实现接口进行统一管理

枚举公共接口

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

public interface IPairs<K, V, C extends Enum> {

   /**

    * 返回枚举对象

    * */

   C get();

   /**

    * 返回枚举项的 key

    * */

   K key();

   /**

    * 返回枚举项的 value

    * */

   V value();

}

状态枚举类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

public enum StatusEnum implements IPairs<Integer, String, StatusEnum> {

   DISABLED( 0 , "record has been disabled" ),

   ENABLED( 1 , "record has been enabled" ),

   DELETES( 9 , "record has been deleted" )

   ;

   private int code;

   private String desc;

   StatusEnum( int code, String desc) {

     this .code = code;

     this .desc = desc;

   }

   public StatusEnum get() {

     return this ;

   }

   @Override

   public Integer key() {

     return this .code;

   }

   @Override

   public String value() {

     return this .desc;

   }

}

响应枚举类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

public enum ResponseEnum implements IPairs<Integer, String, ResponseEnum> {

   SUCCESS( 10000 , "success" ),

   FAILED( 10001 , "failed" )

   ;

   private int code;

   private String desc;

   ResponseEnum( int code, String desc) {

     this .code = code;

     this .desc = desc;

   }

   public ResponseEnum get() {

     return this ;

   }

   @Override

   public Integer key() {

     return this .code;

   }

   @Override

   public String value() {

     return this .desc;

   }

}

代码验证

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public class AnswerApp {

   public static void main(String[] args) {

     invoke(StatusEnum.ENABLED);

     System.out.println();

     response(ResponseEnum.SUCCESS);

   }

  

   private static void response(IPairs pairs) {

     System.out.println(pairs.get() == ResponseEnum.SUCCESS);

     System.out.println(MessageFormat.format( "key: {0}, value: {1}" , pairs.key(), pairs.value()));

   }

  

   private static void invoke(IPairs pairs) {

     System.out.println(pairs.get() == StatusEnum.ENABLED);

     System.out.println(MessageFormat.format( "key: {0}, value: {1}" , pairs.key(), pairs.value()));

   }

程序运行结果

?

1

2

3

4

true

key: 1 , value: record has been enabled

true

key: 10 , 000 , value: success

结论:

项目中使用同一接口管理枚举类, 在方法参数中使用接口而不是用具体的枚举对象作为入参, 可以一定程度上降低程序的耦合性

补充:java中enum类的两种接口的实现方法

和普通 Java 类一样,枚举类可以实现一个或多个接口

若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只 要统一实现该方法即可。

若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式, 则可以让每个枚举值分别来实现该方法

1、enum关键字定义枚举类实现接口的情况

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

```java

interface info{

   void show();

}

enum Season1 implements info{

   //用enum关键字后,首先要把类里面定义的对象提到最前面,将一些重复

   // 的前缀的去掉,每个对象之间要用逗号隔开,最后一个用分号

   //后面的就没有什么变化

    SPRING ( "春天" , "春意暖暖" ),

    SUMMER ( "春天" , "春意暖暖" ),

    AUTUMN ( "春天" , "春意暖暖" ),

    WINTER ( "春天" , "春意暖暖" );

   private final String seasonName;

   private final String seasonDeac;

   private Season1(String seasonName,String seasonDeac){

   this .seasonDeac = seasonDeac;

   this .seasonName = seasonName;

   }

   public String getSeasonDeac() {

     return seasonDeac;

   }

   public String getSeasonName() {

     return seasonName;

   }

   //注意这时候没有重写toString方法,即但是依然可以输出对象

   // 的内容。即enum类不是继承object类,而是默认继承

   //lang包下的enum类

   @Override

   public void show() {

     System.out.println( "这是一个季节" );

   }

}

enum接口的实现和普通类实现没有什么区别

二、让 枚举类的对象分别去实现接口中的抽象方法

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

```java

```java

/**

  * @author LYH_351147852@QQ.COM

  * @create 2019-10-05 21:39

  */

public class SeasonTest1 {

   public static void main(String[] args) {

     Season1[] values = Season1.values();

     for ( int i = 0 ;i < values.length;i++){

       values[i].show();

     }

   }

}

interface info{

   void show();

}

enum Season1 implements info{

   //用enum关键字后,首先要把类里面定义的对象提到最前面,将一些重复

   // 的前缀的去掉,每个对象之间要用逗号隔开,最后一个用分号

   //后面的就没有什么变化

    SPRING ( "春天" , "春意暖暖" ){

     @Override

     public void show() {

       System.out.println( "春天美好" );

     }

   },

    SUMMER ( "夏天" , "夏日炎炎" ){

      @Override

      public void show() {

        System.out.println( "夏天炎热" );

      }

    },

    AUTUMN ( "秋天" , "秋高气爽" ){

      @Override

      public void show() {

        System.out.println( "秋天寒冷" );

      }

    },

    WINTER ( "冬天" , "寒风呼啸" ){

      @Override

      public void show() {

        System.out.println( "寒风呼啸" );

      }

    };

   private final String seasonName;

   private final String seasonDeac;

   private Season1(String seasonName,String seasonDeac){

   this .seasonDeac = seasonDeac;

   this .seasonName = seasonName;

   }

   public String getSeasonDeac() {

     return seasonDeac;

   }

   public String getSeasonName() {

     return seasonName;

   }

   //注意这时候没有重写toString方法,即但是依然可以输出对象

   // 的内容。即enum类不是继承object类,而是默认继承

   //lang包下的enum类

//  @Override

//  public void show() {

//    System.out.println("这是一个季节");

//  }

}

在每一个对象逗号前面加一个大括号,然后里面写上重写的方法

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。

原文链接:https://jaemon.blog.csdn.net/article/details/93494983

查看更多关于Java 利用枚举实现接口进行统一管理的详细内容...

  阅读:19次