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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值