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里面含有定义的常量,所以比直接使用常量耗费更多内存你,所以官方不推荐。