自从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枚举(enum)是Java语言中的一种特殊数据类型,用于定义一组有限的常量,这些常量在程序中作为固定的值使用。枚举在Java中被引入,目的是为了更好地管理和使用常量,提高代码的可读性和安全性。在本实例代码中,...
Java枚举类型(Enum)是Java SE 5.0引入的一种新的数据类型,它为开发者提供了更为强大且安全的方式来表示一组常量。枚举在Java中不仅是一个类,还是一种特殊的类型,允许我们定义自己的常量集合。接下来,我们将...
### Java枚举类型详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种重要的数据类型,在程序设计中扮演着不可或缺的角色。本文将深入探讨Java枚举类型的特性和用法,并通过具体实例说明其优势所在。枚举...
Java枚举类型是Java语言中一种特殊的类,用于定义固定的常量集合,它提供了一种安全、类型化的方式来表示一组有限的值。枚举在Java中被引入为一个完整的类型,不同于C++中的枚举,这使得Java枚举更加强大且易于使用...
Java枚举(Enum)状态机是一种使用枚举类型来实现状态转换逻辑的编程技术,它在Java编程中被广泛应用于管理对象的状态变化。状态机是一种模型,用于描述一个系统或对象在不同时间点可能存在的状态以及如何从一个状态...
java枚举结果类、根据状态值获取枚举值 Controller: /** 模块类型枚举 */ model.addAttribute("mType", ModuleTypeEnum.ModuleTypeShow()); ftl: value="${mType.key}:${mType.value}” </#list>
Java枚举类型(enum)是Java语言中一种特殊的类,用于定义一组固定的常量。它在许多场景下作为替代常量或单例模式的选择,提供了更安全、更易读的代码。下面我们将深入探讨Java枚举类的用法及其优势。 1. **枚举的...
本篇文章将深入探讨Java枚举的特性、用法以及如何在实际开发中充分利用它们。 一、枚举的基本用法 1. 声明枚举类型: ```java public enum Color { RED, GREEN, BLUE } ``` 在这里,`Color`是枚举类型,`RED`, `...
Java枚举类型是Java语言中的一种特殊的类,用于定义一组固定的常量集合。它在Java中扮演着重要的角色,提供了一种安全、类型化的常量表示方式,比传统的final static变量更具有优势。理解Java枚举类型对于编写高质量...
### Java 枚举类型详解 #### 一、引言 ...通过以上的介绍,我们可以看到Java枚举类型不仅提供了类型安全的保障,还为开发者带来了极大的灵活性。合理地使用枚举类型,可以显著提高代码的质量和可维护性。
在本文中,我们将深入探讨Java枚举的定义、使用方法以及它如何改善传统使用`static final`常量的模式。 首先,让我们看看传统的`static final`常量表示枚举的方式。例如,清单1展示了如何使用`public static final`...
Java枚举是编程语言Java中的一个特色特性,它在类、接口和变量的定义中扮演着特殊的角色。枚举在Java中被用作一种数据类型,用于定义一组固定的常量,这些常量可以代表特定的值或状态。通过枚举,我们可以确保变量...
一个关于JAVA枚举类型的MHT文件,包含JAVA枚举类型的用法,以及JDK版本的问题。
Java枚举是面向对象编程中的一个重要特性,它用于定义固定的常量集合,这些常量通常代表某种特定的数据类型。在Java中,枚举提供了一种更安全、更规范的方式来处理常量,相比于传统的final static变量,枚举具有更多...
本文详尽地论述了Java枚举与设计模式的关系
如有侵权请联系删除,欢迎批评指正 java枚举,起初在网上抄了一部分,然后自己加了点示例,做一个记录,也算是为以后留个备份,技术小白一个,还在努力成长
Java 枚举类的属性、方法和构造方法应用实战 Java 枚举类是一种特殊的类,它拥有自己的属性、方法和构造方法。本文将详细介绍 Java 枚举类的属性、方法和构造方法应用实战,结合实例形式分析了 Java 枚举类的定义、...
下面我们将深入探讨Java枚举类型的常见用法。 首先,枚举类型在本质上等同于定义了一组静态常量。创建枚举类型的语法如下: ```java public enum Belle { para1, para2, para3, para4; } ``` 这会创建一个名为`...
深入理解 Java 枚举 Java 枚举是 Java 语言中的一种特殊类型,自 JDK 5 开始引入,使用 enum 关键字修饰。在 Java 中,枚举是一种受限制的类,具有自己的方法。枚举的本质是 java.lang.Enum 的子类,它提供了一些...
全面掌握 Java 枚举类型(enum type) Java 枚举类型是一种特殊的数据类型,它可以取有限个数的明确值。枚举类型的引入解决了 int 枚举模式和 String 枚举模式的缺点,提供了类型安全性、可读性和性能等优势。 ...