`
k_lb
  • 浏览: 834065 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论
  • kitleer: 据我所知,国内有款ETL调度监控工具TaskCTL,支持ket ...
    kettle调度

JAVA ENUM

 
阅读更多

在C语言中存在一个枚举类型,通过此类型可以限制一个内容的取值范围,但是在JDK1.5之前,java中并不存在枚举的类型,所以很多之前已经习惯使用枚举操作的开发人员就感觉很不适应,为了解决这样的问题,所以在JDK1.5之后加入了枚举的类型


在JDK1.5之前为了实现与枚举类似的功能,往往都使用以下的操作形式,例如:颜色Color的操作范围:红色、绿色、蓝色


package org.enumdemo;

public class colordemo {

	private String name;
	
	public static final colordemo RED = new colordemo("红色");
	public static final colordemo BLUE = new colordemo("蓝色");
	public static final colordemo GREEN = new colordemo("绿色");
	
	private colordemo(String name){
		this.setName(name);
	}
	
	public void setName(String name){
		this.name = name;
	}
	
	public String getName(){
		return this.name;
	}
	
	public static Color getInstance(colordemo color){
		if (color == RED){
			return RED;
		}else if(color == BLUE){
			return BLUE;
		}else{
			return GREEN;
		}
	}
}

以上的代码,就是将构造方法进行私有化的一种操作,所以以后要么通过static 属性得到Color 的实例化对象


package org.enumdemo;

public class EnumDemo01 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(colordemo.RED.getName());
		System.out.println( colordemo.getInstance(colordemo.BLUE));
		
		System.out.println(ColorDemo01.RED);
	}

}

实现枚举还要以使用接口


package org.enumdemo;

interface ColorDemo01{
	public static final int RED =1;
	public static final int BLUE =2;
	public static final int GREEN =3;
}

但是,通过以上的方式实现的枚举是会存在问题,会存在操作结果不正确的问题


package org.enumdemo;

public class EnumDemo01 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(ColorDemo01.RED+ColorDemo01.BLUE);
	}

}

以上的操作有可能发生歧义,而且也不能明确的知道一个枚举的取值范围


Enum 关键字

在JDK1.5之后,可以直接使用enum关键字定义一个枚举的类型


package org.enumdemo;

public enum ColorEnum{
    RED,BLUE,GREEN;
}


此时已经完了一个枚举类型的定义,那么在使用的时候直接通过


package org.enumdemo;

public class EnumDemo02 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ColorEnum c = ColorEnum.RED;
        System.out.print(c);
    }

}

而且,使用此方式还可以避免之前使用接口实现枚举的操作


package org.enumdemo;

public class EnumDemo02 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.print(ColorEnum.RED + ColorEnum.BLUE);
	}

}

而且枚举在JDK1.5之后也可以直接在switch语句之中使用,switch判断是时候只能判断字符或数字但是JDK1.5之后可以判断枚举类型


package org.enumdemo;

public class EnumDemo03 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		switch (ColorEnum.RED){
			case RED:{
				System.out.println("红色");
				break;
			}
			case BLUE:{
				System.out.println("蓝色");
				break;
			}
			case GREEN:{
				System.out.println("绿色");
				break;
			}
		}
	}

}


Enum类和enum关键字的区别


使用enum关键字可以定义一个枚举类型,那么实际上就相当于定义了一个类,此类继承了Enum类而已。

在Enum类的构造方法中是受保护的,实际上对于每个枚举对象一旦声音之后,就表示自己调用此构造方法,所有的编号采用自动编号的方式进行


package org.enumdemo;

public class EnumDemo04 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(ColorEnum col:ColorEnum.values()){
			System.out.println(col.name()+"-->"+col.ordinal());
		}
	}

}

还可以通过此类找到枚举 中的一个指定的内容使用valueof()方法

public static <T extends Enum<T>> T valueOf(Closs<T> enumType,String name)

传入的时候直接传入:Color.class 即可


package org.enumdemo;

public class EnumDemo05 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ColorEnum col = ColorEnum.valueOf(ColorEnum.class,"RED");
		System.out.println(col);
	}

}

通过以上的代码可以发现,直接通过枚举取得指定内容更加简单


类集对枚举的支持

在JDK 1.5之后,增加了两个类集的操作类: EnumSet、EnumMap


EnumMap


EnumMap是Map接口的子类。操作的形式与Map是一致的


package org.enumdemo;

import java.util.EnumMap;
import java.util.Map;

public class EnumDemo03 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		EnumMap<Color,String> emap = new EnumMap<Color,String>(Color.class);
		emap.put(Color.red, "红色");
		emap.put(Color.green, "绿色");
		emap.put(Color.blue, "蓝色");
		
		for (Map.Entry<Color,String> me:emap.entrySet()){
			System.out.println(me.getKey()+"-->"+me.getValue());
		}
	}

}


EnumSet

EnumSet 本身是Set接口的子类,但是在此类中并没有任何的构造方法定义,表示构造方法被私有化了。此类的方法都是静态的操作。


package org.enumdemo;

import java.util.EnumSet;
import java.util.Iterator;

public class EnumDemo04 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		EnumSet<Color> mset = EnumSet.allOf(Color.class); //表示将全部的内容设置到集合
		Iterator<Color> ite = mset.iterator();
		
		while(ite.hasNext()){
			System.out.println(ite.next());
		}
	}

}


以上是将全部的内容设置到集合之中,当然,也可以设置一个指定类型的空集合


package org.enumdemo;

import java.util.EnumSet;
import java.util.Iterator;

public class EnumDemo05 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		EnumSet<Color> mset = EnumSet.noneOf(Color.class); //表示此类型的空集合
		Iterator<Color> ite = mset.iterator();
		
		while(ite.hasNext()){
			System.out.println(ite.next());
		}
	}

}


定义构造方法


枚举的使用非常的灵活,可以在枚举中直接定义构造方法,但是一旦构造方法定义之后,则所有枚举对象都必须明确的调用此构造方法。


package org.enumdemo;

public enum Color1 {
	red("红色"),green("绿色"),blue("蓝色");
	
	private String name;
	
	public String getName(){
		return this.name;
	}
	
	public void setName(String name){
		this.name = name;
	}
	
	Color1(String name){
		this.setName(name);
	}


}

枚举中的构造是不能声明为public 的,因为外部是不能调用枚举的构造方法

那么此时,每一个枚举对象都有其自己的name 属性


package org.enumdemo;

public class EnumDemo06 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for (Color1 col:Color1.values()){
			System.out.println(col.ordinal()+"-->"+col.name()+":"+col.getName() );
		}
	}

}


让枚举实现一个接口


一个枚举实现一个接口之后,各个枚举对象都必须分别实现接口中的抽象方法


package org.enumdemo;

interface Color2{
	public String getColor();
}



package org.enumdemo;

public enum Color4  implements Color2{ //实现接口
	red{
		public String getColor(){
			return "红色";
		}
	},green{
		public String getColor(){
			return "绿色";
		}		
	},blue{
		public String getColor(){
			return "蓝色";
		}		
	};

}

package org.enumdemo;

public class EnumDemo07 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for (Color4 col:Color4.values()){
			System.out.println(col.ordinal()+"-->"+col.name()+":"+col.getColor() );
		}
	}

}


在枚举中定义抽象方法


在一个枚举中也可以定义多个抽象方法,那么这样一来,枚举中的每个对象都必须单独实现此方法


package org.enumdemo;

public enum Color3 {
	red{
		public String getColor(){
			return "红色";
		}
	},green{
		public String getColor(){
			return "绿色";
		}		
	},blue{
		public String getColor(){
			return "蓝色";
		}		
	};
	
	private String name;
	
	public void setName(String name){
		this.name = name;
	}
	
	public String getName(){
		return this.name;
	}
	
	public abstract String getColor();

}

package org.enumdemo;

public class EnumDemo07 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for (Color3 col:Color3.values()){
			System.out.println(col.ordinal()+"-->"+col.name()+":"+col.getColor() );
		}
	}

}


分享到:
评论

相关推荐

    java enum 枚举 学习资料

    "Java Enum 枚举学习资料" Java Enum 枚举学习资料是 Java 编程语言中的一种特殊类型,它主要用来实现一组固定的常量。 Enum 枚举类型是 Java 5 中引入的一种新特性,旨在解决传统的 int 枚举常量的缺陷。 1. 枚举...

    Java enum的用法详解

    Java enum 的用法详解 Java enum(枚举)是一种特殊的数据类型,用于定义一组固定的常量。从 JDK 1.5 开始,Java 引入了 enum 机制,解决了传统的常量定义方式的不足。 用法一:常量 在 JDK 1.5 之前,我们定义...

    Java Enum使用Demo源码

    在Java编程语言中,枚举(Enum)是一种特殊的类,用于定义固定的常量集合。它在许多场景下比常量接口或静态final变量更安全、更方便。本篇将通过"Java Enum使用Demo源码"深入探讨Java枚举的用法。 首先,枚举在Java...

    Java enum的用法详解.docx

    Java 枚举(enum)是Java 1.5 引入的一种新的数据类型,它用于表示一组相关的值,这些值可以被当作常量来使用。枚举类型比传统的静态常量更加安全,可读性更好,并且允许进行更丰富的定制。下面我们将详细探讨Java ...

    java enum 枚举的spring boot2.x完美实现demo源码

    在Java编程语言中,枚举(`enum`)是一种强大的工具,它允许我们定义一组预定义的常量。在Spring Boot 2.x框架中,枚举的使用可以帮助我们更好地管理和组织代码,提供类型安全和可读性。本篇将深入探讨如何在Spring ...

    java的Enum

    ### Java的Enum知识点详解 #### 一、枚举的基本概念 在Java中,`enum`(枚举)是一种特殊的类,用于定义一组常量值。它可以帮助开发者限制一个变量的可能值,使其只能从预定义的一组选项中选择。枚举提供了一种更...

    Java Enum和String及int的相互转化示例

    Java Enum和String及int的相互转化示例 Java Enum和String及int的相互转化示例是Java编程语言中的一种重要技术,通过本文,我们将详细介绍Java Enum和String及int的相互转化示例,并提供详细的示例代码,帮助大家更...

    javaenum学习.pdf

    以下是对`javaenum学习.pdf`中提到的Java枚举相关知识点的详细说明: 1. **枚举元素定义**: - 枚举元素的列表必须写在枚举类的开头,元素之间用逗号分隔。如果元素列表后面没有其他内容,可以不加分号;如果有...

    Java enum(枚举)的使用

    Java 枚举(enum)是Java 1.5版本引入的一种强大的类型,它允许开发者定义一组预定义的常量,这些常量具有特定的名称和顺序。枚举在很多场景下替代了传统的常量定义方式,增加了代码的可读性和安全性。 首先,枚举...

    Java enum的用法详细介绍及实例代码

    在Java编程语言中,`enum`(枚举)是一种强大的类型,它允许开发者定义一组预定义的常量。枚举在许多方面都优于传统的静态常量,因为它提供了更多的功能和灵活性。以下是对Java `enum`的详细用法和实例代码的深入...

    Java枚举类型Enum的用法

    Java枚举类型(Enum)是Java SE 5.0引入的一种新的数据类型,它为开发者提供了更为强大且安全的方式来表示一组常量。枚举在Java中不仅是一个类,还是一种特殊的类型,允许我们定义自己的常量集合。接下来,我们将...

    java enum枚举教程学习资料

    Java枚举(enum)是Java语言提供的一种特殊的数据类型,用于定义一组有限的常量,这些常量在程序中作为固定的值使用。枚举在Java中是类的子类型,因此,它们具备类的一些特性,比如可以有方法、变量以及实现接口。...

    javaenum(枚举)使用详解+总结.pdf

    Java中的枚举(enum)是自JDK 1.5版本引入的一种强大的类型,它用于定义一组相关的常量。枚举在Java中被设计为一种特殊的类,它们默认继承自`java.lang.Enum`抽象类,并且是单继承的,这意味着它们无法再继承其他类...

    初学者java enum样例详解

    java初学者内容对于enum类型,可能仅仅停留在枚举项只有一个字段的数据,在实际开发中可能对着每个枚举项包含几个信息,key value,学生姓名,年龄,身高等,样例详细定义了包含多个值enum类型并使用,请参考文件

    Java中的Enum的使用与分析

    ### Java中的Enum深入解析 #### 引言 在Java编程语言中,`Enum`是一种特殊的数据类型,用于处理一组固定的常量。它不仅提供了一种更安全、更灵活的方式来表示一组固定的选择,还包含了丰富的内置功能,使得枚举...

    java Enum EnumMap 简单例子

    简单查询算法,供学习参考。 代码中描述了Enum和EnumMap类的使用。

    Java Enum的简单使用

    Java Enum的简单使用 Java Enum是一种特殊的数据类型,它可以取代以前的常量类,Enum类型提供了许多优点,如类型安全、可读性强、节省代码等。下面我们来详细介绍Java Enum的简单使用。 Enum的定义 在上面的代码...

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

    在Java编程语言中,枚举(enum)是一种特殊的类,用于定义一组固定的常量。它在许多场景下比使用常量或int类型的硬编码值更安全、更具可读性。本篇文章将深入探讨Java枚举的特性、用法以及如何在实际开发中充分利用...

    java中enum枚举的详细用法

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

Global site tag (gtag.js) - Google Analytics