自从java1.5之后,使用了多年java的枚举,一直只是把它当做常量集合的替代工具,从来没想过枚举究竟是什么以及都可以做什么。
直到前几天看到一段使用枚举做单例的代码,才发现原来枚举不仅仅是常量的集合那么简单。
1. 最常用的使用如下,这也是我过去多年一直以来使用枚举的方法:
1: public enum Enum1 {
2: BLUE,GREEN,RED;
3: }
尝试打印一下,在这种情况下,输出结果为BLUE和RED。每个元素显然都是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中认为枚举是实现单例模式的最佳办法,但是我却有一个小小疑问。
如果我的单例类的构造函数需要参数,但这些参数又只有在运行时才能得知。
那么对于来定义枚举时就必须实例化每个元素的枚举来说,这种需求,不是就无能为力了么?
分享到:
相关推荐
java枚举小例子,简单了解枚举的用法,适合初学者使用。
java枚举结果类、根据状态值获取枚举值 Controller: /** 模块类型枚举 */ model.addAttribute("mType", ModuleTypeEnum.ModuleTypeShow()); ftl: value="${mType.key}:${mType.value}” </#list>
列举java 枚举相关信息列举java 枚举相关信息列举java 枚举相关信息 列举java 枚举相关信息 列举java 枚举相关信息 列举java 枚举相关信息 列举java 枚举相关信息
java枚举类型的说说明,详细阐述了枚举类型的使用和注意事项
简单总结java枚举类型,适合java初学者
java枚举状态机
java 枚举ppt 枚举定义 用普通类模拟枚举 带构造方法的枚举 带抽象方法的枚举 单例与枚举 枚举与类集
一个关于JAVA枚举类型的MHT文件,包含JAVA枚举类型的用法,以及JDK版本的问题。
理解java枚举类型
Java枚举类型.pdf
本文详尽地论述了Java枚举与设计模式的关系
如有侵权请联系删除,欢迎批评指正 java枚举,起初在网上抄了一部分,然后自己加了点示例,做一个记录,也算是为以后留个备份,技术小白一个,还在努力成长
关于java枚举的一个实例,
NULL 博文链接:https://rensanning.iteye.com/blog/2013734
JAVA枚举JAVA枚举
JAVA枚举类型的用法详解 例举了JAVA 枚举类型常见用法
枚举的简单的介绍 枚举的作用 1.枚举可以实现一个或多个接口 2.可以定义新的变量 3.可以定义新的方法 4.可以定义根据具体枚举值而相异的类
java 枚举 学习心得
枚举的用法,导入myeclipse看
java枚举