以下为本人的学习笔记

1.认识枚举

  • 枚举不是类,是跟类,接口同级别的类型,

  • 枚举就是限制某个类型的变量的取值只能为诺干个固定值中的一个,否则编译器就会报错

  • 枚举可以让编译器在编译时就可以控制源程序赋给的非法值,使用普通变量的方式在开发阶段无法实现这一目标

  • 在JDK1.5之后,使用关键字enum定义一种新的类型,称为枚举类型,枚举是列举出来,选其中的一个

  • 枚举的本质是一个继承了Enum类的子类,JVM编译器把枚举编译后生成一个final class

2.枚举的关键字和方法

关键字:enum ,跟class,interface类似

public class EnumDemo{
 public static final int RED = 0x1;
 public static final int GREEN = 0x2;
 public static final int BLUE = 0x3;
//public int color;//变量,可以随意赋值
 
 public Color colorEnum;//Color是一个枚举类型
 @Test
 public void test1(){
   //调用时用枚举类型名.对象名
   colorEnum = Color.RED;
   colorEnum = Color.BLUE;
colorEnum = Color.GREEN;
System.out.println(colorEnum);//输出(字符串):GREEN
   //打印colorEnum实际上是打印colorEnum.name()
   
   System.out.println(colorEnum.name());//输出:GREEN
   System.out.println(colorEnum.ordinal());//ordinal序号,编号。输出:1
System.out.println(colorEnum.toString());//输出:GREEN
   
   Color[] values = Color.values();//values()获取Color所有的值
   System.out.println( Arrays.toString(values));//输出:[ RED,GREEN,BLUE]  
  }     
}
​
//定义一个枚举类型
public enum Color{
 //让color必须是RED ,GREEN,BLUE中的一个值
 //下面三个,每一个都代表枚举的一个实例化对象,枚举类型的对象都是从枚举类型内部定义的,外部不能定义枚举对象
 RED,GREEN,BLUE;
 //写上一个对象,内部自动会调用Enum(String name,int ordinal),此构造方法不能被外部直接调用,只能被其子类访问,此构造方法为自动调用
}

3.集合对枚举的支持

在JDK1.5之后,对于Set和Map接口而言又增加了两个新的子类:EnumSet(抽象类)、EnumMap两个类(很少用)

@Test
public void test3(){
EnumSet<Color> set = EnumSet.allOf(Color.class);
 for(Color c :set ){
   System.out.println(c);//输出枚举类型Color的所有实例化对象
  }
 
 //key用枚举类型元素来表示
 EnumMap<Color,String> map = new EnumMap<>(Color.class);
 map.put(Color.RED,"red");
 map.put(Color.GREEn,"green");
 map.put(Color.BLUE,"blue");
​
 
}

4.带构造方法的枚举

通过对象去调用构造方法(但很少使用)

public enum Color{
 //枚举对象后面没有加括号,表示调用无参构造方法
 //枚举对象后面有加括号,表示调用有参构造方法
RED(10),GREEN(20),BLUE;
//可以定义属性
 private int color;
 private Color(){
   System.out.println("无参构造器");
​
  }
 private Color(int color){
   this.color = color;
   System.out.println("有参构造器");
  }
}
@Test
public void test4(){
   System.out.println(Color.RED);//第一次使用枚举,枚举内部的三个对象的构造方法都会被调用
​
}

5.让枚举实现接口

public interface Info{
public int getColor();
}
public enum Color{
RED(10),GREEN(20),BLUE;
 private int color;
 private Color(){
   System.out.println("无参构造器");
  }
 private Color(int color){
   this.color = color;
   System.out.println("有参构造器");
  }
 
 
public int getColor(){
   return color;
  }
}
public void test5(){
System.out.println(Color.RED.getColor());
}

6.在枚举中定义抽象方法

public enum Color{
RED{
   @Override
   publci String getColor2(){
     return "red";
    }
  },GREEN{
   @Override
   publci String getColor2(){
     return "green";
    }
  },BLUE{
   @Override
   publci String getColor2(){
     return "blue";
    }
  };
 
 public abstract String getColor2();
}

使用枚举实现单例设计模式

public enum Singleton{
SINGLETON;
publci void method(){
System.out.println("method");
}
​
}
//使用枚举实现单例设计模式
@Test
public void test5(){
Singleton.SINGLETON.method();
}

最后,枚举更符合我们设计的要求,但是枚举总归是一种类型,因此它占用的内存空间会更大一些。

所以如果内存空间满足要求的话会用枚举,不然一般建议使用常量,而且使用常量的效率会更快一些。

■免责申明
⒈ 本站是纯粹个人学习网站,与朋友交流共赏,不存在任何商业目的。
⒉ 本站利用了部分网络资源,版权归原作者及网站所有,如果您对本站所载文章及作品版权的归属存有异议,请立即通知我们,我们将在第一时间予以删除,同时向你表示歉意!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。