面向对象高级 枚举

面向对象高级 枚举

1.枚举的概述

  • 枚举类型本质上也是一种,只不过是这个类的对象是有限的固定的几个,不能让用户随意创建。--->因此,枚举类的构造器通常需要封装,加上权限修饰符private;
  • 若枚举只有一个对象, 则可以作为一种单例模式的实现方式
  • 枚举类的实现:
    • 在JDK5.0 之前,需要程序员自定义枚举类型。
    • 在JDK5.0 之后,Java支持enum关键字来快速定义枚举类型

  1. 自定义枚举类
  • 私有化类的构造器,保证不能在类的外部创建其对象
  • 在类的内部创建枚举类的实例。声明为:public static final ,对外暴露这些常量对象
  • 对象如果有实例变量,应该声明为private final(建议,不是必须),并在构造器中初始化

自定义枚举典例:

public class SeasonTest {
    public static void main(String[] args) {
        System.out.println(Season.SPRING);
        System.out.println(Season.SPRING.getSEASONNAME());
    }
}


    class Season {
        private final String SEASONNAME;
        private final String SEASONTRAIT;

        private Season(String SEASONNAME, String SEASONTRAIT) {
            this.SEASONNAME = SEASONNAME;
            this.SEASONTRAIT = SEASONTRAIT;
        }

        public String getSEASONNAME() {
            return SEASONNAME;
        }

        public String getSEASONTRAIT() {
            return SEASONTRAIT;
        }

        public static final Season SPRING = new Season("SPRING","gentle");
        public static final Season SUMMER = new Season("SUMMER", "hot");
        public static final Season AUTUMN = new Season("AUTUMN", "cool");
        public static final Season WINTER = new Season("WINTER", "cold");

        @Override
        public String toString() {
            return "Season{" +
                    "SEASONNAME='" + SEASONNAME + '\'' +
                    ", SEASONTRAIT='" + SEASONTRAIT + '\'' +
                    '}';
        }
    }



  1. Enum关键字枚举类写法:

(1)enum类中应当将声明的实例写在开头,删去重复的 public  static  final前置修饰,通常写作:

实例名 (构造器形参1,构造器形参2,),

实例名 (构造器形参1,构造器形参2);

(2)声明枚举类中封装的属性,前置修饰通常为 private  final,通常写作:

private final 数据类型 属性名;

(3)因为属性已经封装,且为final类型,只在构造器中完成赋值,不可重写、不能改变,因此只需要提供get方法。

此处可使用快捷键AIt + Insert实现get方法的快速获取。(idea中)

(4)必写:封装构造器。通常写作:

private  enum类名(属性1,属性2,属性3){

this.属性1 = 属性1;

this.属性2 = 属性2;

this.属性3 = 属性3;

}

此处操作也可通过快捷键AIt + Insert实现,但应当注意自行将默认public权限符修改为private权限符。

(5)(非必写)重写toString方法。

重写toString方法是为了在main方法中输出enum实例时,以需要的格式输出。与另外引入getInfo接口相类似。

同样的,此处仍可以利用快捷键AIt + Insert完成根据自身的需求进行重写。

public class SeasonTest1 {

public static void main(String[] args) {
    System.out.println(Season.SPRING);
    System.out.println(Season.SPRING.getSEASONNAME());
}
}

enum Season1{
//必须在枚举类的开头生声明多个对象,多个对象之间用逗号隔开、
    SPRING ("SPRING","gentle"),
    SUMMER ("SUMMER", "hot"),
    AUTUMN ("AUTUMN", "cool"),
    WINTER ("WINTER", "cold");

    private final String SEASONNAME;
    private final String SEASONTRAIT;

    private Season1(String SEASONNAME, String SEASONTRAIT) {
        this.SEASONNAME = SEASONNAME;
        this.SEASONTRAIT = SEASONTRAIT;
    }

    public String getSEASONNAME() {
        return SEASONNAME;
    }

    public String getSEASONTRAIT() {
        return SEASONTRAIT;
    }


    @Override
    public String toString() {
        return "Season{" +
                "SEASONNAME='" + SEASONNAME + '\'' +
                ", SEASONTRAIT='" + SEASONTRAIT + '\'' +
                '}';
    }
}

enum方式定义的要求和特点
  • 枚举类的常量对象列表必须在枚举类的首行,因为是常量,所以建议大写。
  • 列出的实例系统会自动添加 public static final 修饰。
  • 如果常量对象列表后面没有其他代码,那么“;”可以省略,否则不可以省略“;”。
  • 编译器给枚举类默认提供的是private的无参构造,如果枚举类需要的是无参构造,就不需要声明,写常量对象列表时也不用加参数
  • 如果枚举类需要的是有参构造,需要手动定义,有参构造的private可以省略,调用有参构造的方法就是在常量对象名后面加(实参列表)就可以。
  • 枚举类默认继承的是java.lang.Enum类,因此不能再继承其他的类型
  • JDK5.0 之后switch,提供支持枚举类型,case后面可以写枚举常量名,无需添加枚举类作为限定。

4.枚举类的五种常用方法

(1)String toString(): 默认返回的是常量名(对象名),可以根据需求手动重写该方法。

例:

@Override
public String toString() {
    return "Season{" +
            "SEASONNAME='" + SEASONNAME + '\'' +
            ", SEASONTRAIT='" + SEASONTRAIT + '\'' +
            '}';
}


    
2static 枚举类型[] values():返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值,是一个静态方法

Season1[] values = Season1.values();
for(int i=0;i<values.length;i++){
    System.out.println(values[i]);
}

执行结果是将所有的常量对象全部打印。
    
3static 枚举类型 valueOf(String name):可以把根据输入的字符串查找对应的枚举类对象。要求字符串必须是枚举类常量对象名相同。如不是,会有运行时异常:IllegalArgumentException。

//if the target objName doesn't exist,will show error
String objName = "WINTER";
Season1 season1 =Season1.valueOf(objName);
System.out.println(season1);

运行结果为枚举类中WINTER对象的具体信息。
    
4String name():得到当前枚举常量的名称。与默认没有重写额的toString方法相同,打印结果相同。

System.out.println(Season1.WINTER.name());

运行结果为WINTER常量名。
    
5int ordinal():返回当前枚举常量的次序号,默认从0开始类似于数组下标index)

// return the index
System.out.println(Season1.AUTUMN.ordinal());

5、实现枚举类的接口

  • 和普通 Java 类一样,枚举类可以实现一个或多个接口
  • 若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可。

例:

interface Info{
    void show();
}



enum Season1 implements Info {

...//具体内容省略,与前文典例相同

@Override
public void show() {
    System.out.println("It's now " + SEASONNAME);
}

}

  • 若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式,则可以让每个枚举对象实例分别来实现接口的抽象方法

例:

interface Info1{
    void show();
}

enum Season2 implements Info1 {
    //必须在枚举类的开头生声明多个对象,多个对象之间用逗号隔开、

//每个对象依次重写
    SPRING("SPRING", "gentle"){
        public void show(){
        System.out.println("Spring comes.");
        }
    },

    SUMMER("SUMMER", "hot"){
        public void show(){
            System.out.println("Summer comes.");
        }
    },

    AUTUMN("AUTUMN", "cool"){
        public void show(){
            System.out.println("Autumn comes.");
        }
        },

    WINTER("WINTER", "cold"){
        public void show(){
            System.out.println("Winter comes.");
        }
    };

}每个方法依次重写接口Info中的抽象方法。

enum类实现多个接口的一般写法;

enum A implements 接口1,接口2{
    常量名1(参数){
        //抽象方法的实现或重写
    },
    常量名2(参数){
        //抽象方法的实现或重写
    },
    //...
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值