javaSE 枚举类型

枚举类型可以取代以往常量的定义方式,就是将常量封装在类或接口中。
枚举类型还提供了安全检查功能。枚举类型本质上是以类的形式存在的

枚举类型

(1)使用枚举类型设置常量

将常量放置在接口中,该常量不能被修改,因为在接口中定义常量时,该常量的修饰符为final与static

 在接口中定义常量
 
public interface Constants{
		public static final double PI=3.14;
		public static final int X=1;
}
使用枚举类型定义常量
public enum Constants{
		PI,         //注意之间用逗号  
		X             
		//最后没有符号
}

当程序使用常量时,就用Constants.PI来使用

package com.ENUM;

import com.sun.xml.internal.bind.v2.model.core.EnumConstant;

interface InterfaceConstants{
    public static int c1=1;
    public static int c2=2;
}


public class Demo {
    enum EnumConstants{
        c1,c2
    }
    public static void doitInterface(int c){
        switch (c){
            case InterfaceConstants.c1:
                System.out.println("doitInterface()  c1");
                break;
            case InterfaceConstants.c2:
                System.out.println("doitInterface()  c2");
                break;
        }
    }

    public static void doitEnum(EnumConstants e){
        switch (e){
            case c1 :
                System.out.println("doitEnum() c1");
                break;
            case c2:
                System.out.println("doitEnum() c2");
                break;
        }
    }

    public static void main(String[] args) {
        Demo.doitInterface(InterfaceConstants.c1);
        Demo.doitEnum(EnumConstants.c1);
        Demo.doitEnum(EnumConstants.c2);
    }
}

可以看出在接口中定义的常量需要具体的值,而在枚举类型中定义的常量不需要具体的值
当调用doitInterface()方法中传入参数时,不一定传入接口中的常量,因为这个方法的参数是int类型。当调用doitEnum()方法传入参数时,必须传入的是枚举类型中的常量

(2)枚举类型

1.操作枚举类型的方法
枚举类型可以被看作成一个类,它继承与java.lang.Enum类,枚举类型的每一个成员都可以看作是一个枚举类型的实例,它们都被public static final修饰,所以当调用枚举类型成员时可以直接用枚举类型名称调用

方法 说明 使用
values() 将枚举类型成员以数组类型返回 枚举类型名称.values()
valueOf() 该方法可以实现将普通字符串转换为枚举类型实例 枚举类型名称.valuesOf(“abc”) (字符串为枚举成员里面的,它只是将将其转换成实例)
compareTo(E o) 该方法用于比较两个枚举对象在定义时的顺序 枚举成员.compareTo(枚举成员)
ordinal() 该方法用于得到枚举成员的位置索引 枚举成员.ordinal()
使用values()方法

public class Demo {
    enum EnumConstants{
        c1,c2
    }
    public static void main(String[] args) {
        for(int i=0;i<EnumConstants.values().length;i++){
            System.out.println("枚举成员"+(i+1)+":"+EnumConstants.values()[i]);
        }
    }
}
输出结果:
枚举成员1:c1
枚举成员2:c2
使用valueOf(),compareTo()方法

public class Demo {
    enum EnumConstants{
        c1,c2
    }
    public static  void compare(EnumConstants e){
        for(int i=0;i<EnumConstants.values().length;i++){
            System.out.println(e+"与"+EnumConstants.values()[i]+"的比较结果为"+e.compareTo(EnumConstants.values()[i]));       //使用compareTo()比较
        }
    }
    public static void main(String[] args) {
        compare(EnumConstants.valueOf("c2"));      //valueOf转换为实例
    }
}
输出结果:
c2与c1的比较结果为1
c2与c2的比较结果为0

compareTo()的结果为正,说明方法中的参数在其之前。结果为负,说明方法中的参数在其之前。结果为0,说明位置相同

使用ordinal()方法

public class Demo {
    enum EnumConstants{
        c1,c2
    }
    public static void main(String[] args) {
          System.out.println(EnumConstants.c2+"的位置"+EnumConstants.c2.ordinal());
    }
}
输出结果:
c2的位置1

2.枚举类型的构造方法
枚举类型中可以定义构造方法,并且这个构造方法必须是private
并且在定义构造方法后枚举类型成员都必须相应的使用构造方法。

enum EnumConstants{
    c1("枚举成员c1"),
    c2(1);
    private String s;
    private int i;
    private EnumConstants(){
    }
    private  EnumConstants(String s){
        this.s=s;
    }
    private EnumConstants(int i){
        this.i=i;
    }
}

定义了构造方法就可以在枚举类型里定义get方法,用来返回构造方法设置的操作,使用private修饰符,防止用户实例化一个枚举对象

enum EnumConstants{
    c1("枚举成员c1"),
    c2(1);
    private String s;
    private int i;
    private EnumConstants(){
    }
    private  EnumConstants(String s){
        this.s=s;
    }
    private EnumConstants(int i){
        this.i=i;
    }
    public String getS() {
        return s;
    }
    public int getI() {
        return i;
    }
}

public class Demo {
       public static void main(String[] args) {
        for(int i=0;i<EnumConstants.values().length;i++){
            System.out.println(EnumConstants.values()[i]+"调用getI():"+EnumConstants.values()[i].getI()+" 调用getS():"+EnumConstants.values()[i].getS());
        }
        System.out.println(EnumConstants.c1+"调用getS():"+EnumConstants.c1.getS()+" "+EnumConstants.c2+"调用getI():"+EnumConstants.c2.getI());
    }
}
输出结果:
c1调用getI():0 调用getS():枚举成员c1
c2调用getI():1 调用getS():null
c1调用getS():枚举成员c1 c2调用getI():1

除了可以在枚举类型中用getxxx()方法获得枚举成员的描述外,还可以通过将getxxx()方法放在接口里,通过实现接口来获得描述。
每个枚举成员都要实现接口中的方法

package com.ENUM;

import com.sun.xml.internal.bind.v2.model.core.EnumConstant;

interface description{
    public String getS();
    public int getI();
}
enum EnumConstants implements description{
    c1{
        @Override
        public String getS() {
            return "枚举成员c1";
        }

        @Override
        public int getI() {
            return i;
        }
    },
    c2{
        @Override
        public String getS() {
            return "枚举成员c2";
        }

        @Override
        public int getI() {
            return i;
        }
    },
    c3{
        @Override
        public String getS() {
            return "枚举成员c3";
        }

        @Override
        public int getI() {
            return i;
        }
    };
    private static int i=11;

    public static void main(String[] args) {
        for (int i=0;i<EnumConstants.values().length;i++){
            System.out.println(EnumConstants.values()[i]+" getS()方法:"+EnumConstants.values()[i].getS()+"  getI()方法:"+EnumConstants.values()[i].getI());
        }
    }
}
输出结果:
c1 getS()方法:枚举成员c1  getI()方法:11
c2 getS()方法:枚举成员c2  getI()方法:11
c3 getS()方法:枚举成员c3  getI()方法:11

3.枚举类型的优势
枚举类型声明了一种很好的变量定义方法,枚举了某种数据类型所有可能出现的值
枚举类型的特点:类型安全,紧凑有效的数据定义,可以和程序其他部分完美交互,运行效率高

你可能感兴趣的:(java)