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

Java中枚举的用法

 
阅读更多

Java 5里新引用了枚举类型,这篇文章简单介绍一下它的基本用法。

 

一、Name

最简单的枚举定义如下:

enum Colors {
	RED, GREEN, BLACK
}

例如以下定义打印其中某个值的名称:

		Colors c = Colors.RED;
		System.out.println(c.name());
		System.out.println(c);

打印结果为:

RED
RED

可以看到它的toString()方法就是返回它的name,可以看 java.lang.Enum<E> 的源码:

    public String toString() {
        return name;
    }

可以重写toString()方法来返回不同于name的值,例如:

enum Colors {
	RED, GREEN, BLACK;

	@Override
	public String toString() {
		return "Color: "+name();
	}
	
}

再运行上面的程序,返回就是:

RED
Color: RED

二、序号

默认情况下,Enum中定义的每个值都有一个从0开始的序号,例如以上Color的序号分别是:

RED=0
GREEN=1
BLACK=2

可以能序号去获得它对应的值,例如:

System.out.println(Colors.values()[2]);

打印的结果就是BLACK.

三、用于Switch

Enum对象可以用于Switch语句,例如:

		Colors c = ...;
		switch (c) {
		case BLACK:
			System.out.println("black");
			break;
		case GREEN:
			System.out.println("green");
			break;
		case RED:
			System.out.println("red");
			break;

		default:
			break;
		}

四、增加方法和变量

Enum里也可以增加方法和变量,例如:

enum Colors {
	
	RED(3), GREEN(6), BLACK(9);
	
	int index;
	Colors(int index){
		this.index = index;
	}
	
	public int getIndex() {
		return index;
	}
}

注意1:Java要求枚举类型中的所有枚举常量需要定义在所有的变量、构造函数和方法之前;并且如果有变量和方法存在,则常量列表最后要以分号(;)结束。

注意2:枚举中的构造函数只能是private,也即不能通过new来创建新的对象。

 

五、valueOf()方法

valueOf()方法可以把将字符串转成对应的Enum里的值,例如:

		Colors valueOf = Colors.valueOf("RED");
		System.out.println(Colors.RED==valueOf);

六、重写方法

每一个Enum的值也可以重写Enum类定义中的方法,例如上面我们增加了一个index对象,然后用getIndex()方法返回这个值。我们也可以不传入index,通过重写getIndex()方法来实现:

enum Colors {

	RED{
		@Override
		public int getIndex() {
			return 3;
		}
	},
	GREEN{
		@Override
		public int getIndex() {
			return 6;
		}
	},
	BLACK{
		@Override
		public int getIndex() {
			return 9;
		}
	};

	public abstract int getIndex();
}

七、values()方法

values()方法可以返回所有定义的枚举值,例如:

		Colors[] values = Colors.values();
		for(Colors c: values){
			System.out.println(c);
		}

八、实现接口

枚举类型也可以实现接口,例如:

interface Indexable{
	public int getIndex();
}

enum Colors implements Indexable {

	RED{
		public int getIndex() {
			return 3;
		}
	},
	GREEN{
		public int getIndex() {
			return 6;
		}
	},
	BLACK{
		public int getIndex() {
			return 9;
		}
	};
}

注意:枚举类型可以实现接口,但是不能继承类,因为所以有枚举类型都隐含的继承了类java.lang.Enum,而Java只允许单继承。

 

九、EnumSet和EnumMap

EnumSet是Java提供的一个特别的用来存储枚举值的Set,例如:

		EnumSet<Colors> allColors = EnumSet.allOf(Colors.class);
		for(Colors c: allColors){
			System.out.println(c);
		}
		EnumSet<Colors> noneOf = EnumSet.noneOf(Colors.class);
		for(Colors c: noneOf){
			System.out.println(c);
		}
		noneOf.add(Colors.BLACK);
		noneOf.add(Colors.BLACK);
		System.out.println(noneOf);

EnumMap类似于EnumSet,不过这次是map形式的,键值为一个Enum值,值可以是任意的,例如:

		EnumMap<Colors, String> map = new EnumMap<Colors, String>(Colors.class);
		map.put(Colors.RED, "red");
		map.put(Colors.BLACK, "black");
		map.put(Colors.GREEN, "green");
		map.put(Colors.RED, "red2");
		System.out.println(map);

  

十、实现单例

另一个Enum的很好的用处就是实现单例,以前实现单例的方式有:

双重锁定:

public class DoubleCheckedLockingSingleton{
     private volatile DoubleCheckedLockingSingleton INSTANCE;
  
     private DoubleCheckedLockingSingleton(){}
  
     public DoubleCheckedLockingSingleton getInstance(){
         if(INSTANCE == null){
            synchronized(DoubleCheckedLockingSingleton.class){
                //double checking Singleton instance
                if(INSTANCE == null){
                    INSTANCE = new DoubleCheckedLockingSingleton();
                }
            }
         }
         return INSTANCE;
     }
}

Read more: http://javarevisited.blogspot.com/2012/07/why-enum-singleton-are-better-in-java.html#ixzz2ws3osFML

或者直接初始化静态变量:

public class Singleton{
    //initailzed during class loading
    private static final Singleton INSTANCE = new Singleton();
  
    //to prevent creating another instance of Singleton
    private Singleton(){}

    public static Singleton getSingleton(){
        return INSTANCE;
    }
}

Read more: http://javarevisited.blogspot.com/2012/07/why-enum-singleton-are-better-in-java.html#ixzz2ws3v4BTa

但是他们都有各自的缺点:要么就是太复杂、要么就是不能延迟初始化、要不就是系列化时如果不做特定处理还是有问题。

 

而使用Enum就有很多好处:简单、安全:

public enum EasySingleton{
    INSTANCE;
}

 

补充:

另外一种单例的实现方式:

public class TestSingleton {

	private static class SingletonHelper{
		static TestSingleton INSTANCE = new TestSingleton();
	}
	
	private TestSingleton(){
		
	}
	
	public static TestSingleton getInstance(){
		return SingletonHelper.INSTANCE;
	}
}

这种方式也是线程安全的、延迟初始化的,单一的。 

 

分享到:
评论

相关推荐

    Java枚举类型Enum的用法

    接下来,我们将深入探讨Java枚举类型的使用方法及其相关知识点。 1. **枚举的声明与初始化** 枚举类型的声明方式类似于类,但以`enum`关键字开头。例如: ```java enum Color { RED, GREEN, BLUE } ``` 这里...

    java枚举实例代码

    Java枚举(enum)是Java语言中的一种特殊数据类型,用于定义一组有限的常量,这些常量在程序中作为固定的值使用。枚举在Java中被引入,目的是为了更好地管理和使用常量,提高代码的可读性和安全性。在本实例代码中,...

    java枚举类用法

    通过上述介绍,我们了解到Java枚举类的多种用法,包括声明、初始化、方法定义、构造器、转换为集合、遍历、比较、在switch语句中的应用以及序列化等。枚举类不仅提高了代码的可读性和安全性,还简化了常量管理,使得...

    java中枚举的使用

    枚举在Java中的使用不仅提高了代码的可读性和可维护性,还避免了传统常量类的一些潜在问题,如类型安全和非法实例化。 首先,我们来看枚举的基本定义。枚举类型的声明类似于类的声明,但用关键字`enum`开头。例如:...

    java中enum枚举的详细用法

    Java中的枚举(enum)类型是在JDK 1.5版本引入的一个强大的特性,它用于定义一组相关的常量。在C/C++等语言中,枚举通常用来表示一组具有固定值的常量集合,但在Java中,枚举不仅限于此,它提供了更多的功能和灵活性...

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    这些代码可能包括创建枚举类,然后通过反射获取枚举值、实例名以及演示如何使用`getDeclaredConstructor()`和`newInstance()`方法来访问私有构造函数(虽然这不是常规用法)。 通过深入理解这些概念,你可以更好地...

    说说Java中的枚举 转 可以了,够了 包括EnumSet(Map)

    这篇博客将深入探讨Java枚举的特性和使用方法,包括`EnumSet`和`EnumMap`这两个与枚举相关的数据结构。 首先,枚举定义的基本语法是`public enum EnumName {constant1, constant2, ...}`。每个枚举常量都是`...

    Java面试枚举从使用到原理

    本篇文章将深入探讨Java枚举的使用及其背后的原理。 一、枚举的定义与使用 1. 基本用法: 在Java中,枚举可以通过`enum`关键字来创建。例如,我们可以定义一个表示一周七天的枚举类型: ```java public enum ...

    高阶Java-Java枚举类型 enum 应用详解

    本篇文章将深入探讨Java枚举的特性、用法以及如何在实际开发中充分利用它们。 一、枚举的基本用法 1. 声明枚举类型: ```java public enum Color { RED, GREEN, BLUE } ``` 在这里,`Color`是枚举类型,`RED`, `...

    java枚举ppt和详细代码

    Java枚举是面向对象编程中的一个重要特性,它用于定义固定的常量集合,这些常量通常代表某种特定的数据类型。在Java中,枚举提供了一种更安全、更规范的方式来处理常量,相比于传统的final static变量,枚举具有更多...

    在Java中使用枚举

    - Java枚举的运行效率与原始类型相似,因为它们在内存中以紧凑的方式存储,并且在编译时进行优化。 除了标准的枚举定义,Java还有几种“准枚举”类型,例如: - **常量定义**:在Java 5之前,通常使用静态常量来...

    简单总结java枚举类型

    枚举在Java中被引入为一个完整的类型,不同于C++中的枚举,这使得Java枚举更加强大且易于使用。以下是关于Java枚举类型的详细解释和相关知识点: 1. 定义枚举: 在Java中,枚举通过关键字`enum`来定义。例如,创建...

    java中枚举的详细使用介绍

    Java中的枚举是一种特殊的类,它提供了一种安全的方式来表示一组固定的常量。在Java中,枚举由关键字`enum`定义,具有以下特点: 1. 枚举类默认继承自`java.lang.Enum`类,而不是直接继承`Object`类。`Enum`类实现...

    java枚举类型说明

    本文将深入探讨Java枚举类型的特性和用法,并通过具体实例说明其优势所在。枚举类型在Java中的引入标志着一种更为类型安全且灵活的编程方式。 #### 二、Java枚举的基本概念 Java中的枚举是一种特殊的类,用于定义...

    JAVA枚举类型的用法详解

    下面我们将深入探讨Java枚举类型的常见用法。 首先,枚举类型在本质上等同于定义了一组静态常量。创建枚举类型的语法如下: ```java public enum Belle { para1, para2, para3, para4; } ``` 这会创建一个名为`...

    java枚举状态机

    Java枚举(Enum)状态机是一种使用枚举类型来实现状态转换逻辑的编程技术,它在Java编程中被广泛应用于管理对象的状态变化。状态机是一种模型,用于描述一个系统或对象在不同时间点可能存在的状态以及如何从一个状态...

    Java中的“枚举类型

    ### Java中的“枚举类型”知识点详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种特殊的类,其设计初衷是为了更好地处理一组固定不变的常量集合。相较于传统的使用`static final`字段来表示常量的做法...

    java枚举的一个实例

    Java枚举是编程语言Java中的一个特色特性,它在类、接口和变量的定义中扮演着...在JavaDemo项目中,可能包含了各种使用枚举的示例,包括但不限于上述讨论的各种用法,学习和理解这些示例有助于深入理解和应用Java枚举。

    java枚举类的属性、方法和构造方法应用实战

    Java 枚举类的属性、方法和构造方法应用实战 Java 枚举类是一种特殊的类,它拥有自己的属性、方法和构造方法。本文将详细介绍 Java 枚举类的属性、方法和构造方法应用实战,结合实例形式分析了 Java 枚举类的定义、...

    Java中的Enum枚举用法.doc

    ### Java中的Enum枚举用法详解 #### 一、引言 在Java编程语言中,枚举(Enum)是一种特殊的数据类型,它被用来表示一组固定的常量集合。相比于使用常量接口或字符串来表示固定集合,枚举提供了更加安全且易于管理的...

Global site tag (gtag.js) - Google Analytics