java基础之Enum枚举

版权声明:本文为博主原创文章,转载希望能注明出处,感谢。 https://blog.csdn.net/u010126792/article/details/83014679

1 enum的简单使用

枚举是jdk1.5添加的新特性,枚举enum可以将一组具名的值得有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用。上面的说明来自<java编程思想>,我看完了之后得到两个有用信息,把集合表示成一种新类型,新类型可以作为常规的类似普通类进行使用。

编程过程中会用到很多很多的常量,普通的定义方式就是通过定义静态变量的方式(我现在有时依然定义成静态变量),使用方式也十分的简单,但是存在的问题也很明显,虽然定义时可以取名字进行区分,但是如果作为函数参数填入相同类型的任意值都不会报错,如果此时我们想让一个函数只接收特定的某几个固定的常量值,此时是没办法区分的。

enum ColorEnum {
		RED,GREEN,BLUE
	}
	
	private static final int RED = 0;
	private static final int GREEN = 1;
	private static final int BLUE =2;
	
	public void getColor(int col) {
		if(col == RED) {
			
		}
	}
	
	public void getColor(ColorEnum cenum) {
		if(cenum == ColorEnum.RED) {
			
		}
	}

接收枚举类型的函数使用时只能传入枚举类型的值。

如果枚举不添加任何方法,枚举值默认为从0开始的有序数值。定义的枚举常量RED:0,GREEN:1,BLUE:2

枚举和类相似,当却比类的限制要多很多,不能继承enum,但可以将enum当做一个常规的类。

定义一个枚举变量会生成一个对应的枚举类,所以枚举相当于一个类不能再函数内部定义。

枚举中可以增加变量和方法。

2 枚举的其他说明

第1部分介绍了枚举作为常量的使用,下面讲解枚举的其他使用:

2.1 enum支持switch

public void getEnumData(ColorEnum cenum) {
		switch(cenum) {
		
		case RED :
			break;
		case BLUE:
			break;
		case GREEN:
			break;
		}
	}

2.2 enum 静态导入

import static com.ldx.enumdemo.EnumDemo.ColorEnum.*;

import com.ldx.enumdemo.EnumDemo.ColorEnum;

public class Test {

	public static void main(String[] args) {
		ColorEnum color1 = BLUE;

	}

}

2.3 values获取数组

public void valuesDemo() {
		ColorEnum[] data = ColorEnum.values();
		for(ColorEnum c : data) {
			System.out.println(c);
		}
	}

2.4 枚举中可以增加字段和方法

enum ColorEnum {
		RED(1,"red"),GREEN(2,"green"),BLUE(3,"blue");
		private final int key;
		private final String value;
		
	    private  ColorEnum(int key,String value) {
			this.key = key;
			this.value = value;
		}
		
		public int getKey() {
			return key;
		}
		
		public String getValue() {
			return value;
		}
	}

构造函数修饰符不能是public,可以添加函数,构造函数的参数和enum项的参数对应。

2.5 枚举进行常量比较时可以直接利用==进行比较

==一般用于比较地址,枚举的比较可以直接用 “= =”比较,性能会有所提高。

2.6 枚举类编译后默认为final class,不允许继承可防止被子类修改

定义enum,编译后生成了一个单独的enum类,final类型不能被继承。
在这里插入图片描述

final class com.ldx.enumdemo.EnumDemo$ColorEnum extends java.lang.Enum<com.ldx.enumdemo.EnumDemo$ColorEnum> {
  public static final com.ldx.enumdemo.EnumDemo$ColorEnum RED;
  public static final com.ldx.enumdemo.EnumDemo$ColorEnum GREEN;
  public static final com.ldx.enumdemo.EnumDemo$ColorEnum BLUE;
  private static final com.ldx.enumdemo.EnumDemo$ColorEnum[] ENUM$VALUES;
  static {};
  private com.ldx.enumdemo.EnumDemo$ColorEnum(java.lang.String, int);
  public static com.ldx.enumdemo.EnumDemo$ColorEnum[] values();
  public static com.ldx.enumdemo.EnumDemo$ColorEnum valueOf(java.lang.String);
}

javap查看class文件,生成了一个final类

2.7 enum可以实现接口

interface EnumInter{
		public String enumDesc();
	}
	enum ColorEnum implements EnumInter{
		RED(1,"red"){
			@Override
			public String enumDesc() {
				// TODO Auto-generated method stub
				return null;
			}
		},GREEN(2,"green"){

			@Override
			public String enumDesc() {
				// TODO Auto-generated method stub
				return null;
			}
		},BLUE(3,"blue"){
			@Override
			public String enumDesc() {
				// TODO Auto-generated method stub
				return null;
			}
		};
		private final int key;
		private final String value;
		
	    private  ColorEnum(int key,String value) {
			this.key = key;
			this.value = value;
		}

2.8 enum变量为什么不能再进行继承

从2.6我们知道,enum最终会生成一个继承了Enum的类,java不支持多继承所以enum不能再继承其他类。

2.9使用接口组织枚举

无法从enum继承子类,如何扩展enum中的元素呢,可以利用接口方式进行扩展。

public interface Color{
	enum ColorDemo implements Color{
	RED,GREEN,BLUE
}
}

此时枚举的元素都是一种Color类型。

2.10 使用enum实现单例模式

不推荐

3 android中不推荐使用枚举

android开发和普通的java开发不太一样,因为手机设备上的内存是十分珍惜的资源,任何耗费内存的数据结构都应该避免,否则极易造成内存溢出。
enum 定义之后会生成final类型的class,class里面含有定义的常量,所以比直接使用常量耗费更多内存你,所以官方不推荐。

猜你喜欢

转载自blog.csdn.net/u010126792/article/details/83014679