`
lee_3do
  • 浏览: 24996 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java 枚举

    博客分类:
  • Java
阅读更多


自从java1.5之后,使用了多年java的枚举,一直只是把它当做常量集合的替代工具,从来没想过枚举究竟是什么以及都可以做什么。

直到前几天看到一段使用枚举做单例的代码,才发现原来枚举不仅仅是常量的集合那么简单。

1. 最常用的使用如下,这也是我过去多年一直以来使用枚举的方法:

  1: public enum Enum1 {

  2:     BLUE,GREEN,RED;

  3: }

尝试打印一下,在这种情况下,输出结果为BLUERED。每个元素显然都是public static final的。

  1: @Test

  2: public void testEnum1()

  3: {

  4:     System.out.println(Enum1.BLUE);

  5:     System.out.println(Enum1.RED);

  6: }


2 . 更近一步,在枚举类中添加构造函数、变量和方法。

  1: public enum Enum2 {

  2:     GREEN("gre",1),RED("red",2),BLUE("blue",3);

  3:     Enum2(String name, int id) {

  4:         this.setName(name);

  5:         this.id = id;

  6:     }

  7:    

  8:     @Override

  9:     public String toString() {

 10:         return name;

 11:     }

 12:    

 13:     public String test(String test)

 14:     {

 15:         return test+name;

 16:     }

 17:     private String name;

 18:     public int id;

 19: 

 20: }


  构造器无论是否加private修饰符,都是而且只能是private的。

  1: @Test

  2: public void createInstance()

  3: {

  4:     Enum2 enum2 = new Enum2();

  5: }

上面尝试强行构造枚举类型的实例,编译报错。


3.用枚举来做单例。先看代码:

  1: public enum Enum3 {

  2:     RED;

  3:     public String test(String test)

  4:     {

  5:         return test;

  6:     }

  7: }

可以看出通过单元素的枚举类型来实现单例模式比传统方法要简单不少。

测试一下:

  1: @Test

  2: public void testSingleton() {

  3:     Enum3 singleton = Enum3.RED;

  4:     Enum3 singleton2 = Enum3.RED;

  5:     System.out.println(Enum3.RED.test("test"));

  6:     assertSame(singleton, singleton2);

  7:     assertSame(singleton, Enum3.RED);

  8: }

使用enum关键字来实现单例模式的好处是这样非常简洁,并且无偿地提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候。——来自《Effective Java


尽管Effective Java中认为枚举是实现单例模式的最佳办法,但是我却有一个小小疑问。

如果我的单例类的构造函数需要参数,但这些参数又只有在运行时才能得知。

那么对于来定义枚举时就必须实例化每个元素的枚举来说,这种需求,不是就无能为力了么?

0
4
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics