枚举

1. 枚举类概述

  • 在某些情况下,一个类的对象是有限而且固定的。例如季节类,只有四个对象
  • 手动实现枚举类
    • private修饰构造器
    • 属性使用private final修饰
    • 把该类的所有实例都使用 public static final 来修饰

2. 示例代码

package com.atguigu.javase.lesson9;

public class Season {

    //属性是固定的,说明属性是常量
    private final String SEASON_NAME;
    private final String SEASON_DESC;

    //在类的外部不能创建多个对象,所以私有化构造器
    private Season(String seasonName, String seasonDesc){
        this.SEASON_NAME = seasonName;
        this.SEASON_DESC = seasonDesc;
    }

    //在类的内部常见4个对象,且这4个对象都不能被修改
    public final static Season SPRING = new Season("春天","春风又绿江南岸");
    public final static Season SUMMER = new Season("夏天","映日荷花别样红");
    public final static Season AUTUMN = new Season("秋天","秋水共长天一色");
    public final static Season WINTER = new Season("冬天","窗含西岭千秋雪");
}

2. 使用enum定义枚举类

  • JDK1.5新增的enum关键字用于定义枚举类
  • 枚举类和普通类的区别:
    • 使用enum定义的枚举类默认继承了java.lang.Enum类
    • 枚举类的构造器只能使用private访问控制符
    • 枚举类的所有实例必须在枚举类中显式列出(,分隔 ;结尾)。列出的实例系统会自动添加public static final修饰。
    • 所有的枚举类都提供了一个values方法,该方法可以很方便地遍历所有的枚举值。
  • JKD1.5中可以在switch表达式中使用枚举类的对象作为表达式,case子句可以直接使用枚举值的名字,无需添加枚举类作为限定。
  • 若枚举只是一个成员,则可以作为一种单例模式的实现方式。

3. 枚举类属性

  • 枚举类对象的属性不应允许被改动,所以应该使用private final修饰
  • 枚举类使用private final修饰的属性应该在构造器中为其赋值
  • 若枚举类显式的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数

4. 示例代码season

package com.atguigu.javase.lesson9;

public class Season {

    //属性是固定的,说明属性是常量
    private final String SEASON_NAME;
    private final String SEASON_DESC;

    //在类的外部不能创建多个对象,所以私有化构造器
    private Season(String seasonName, String seasonDesc){
        this.SEASON_NAME = seasonName;
        this.SEASON_DESC = seasonDesc;
    }

    //在类的内部常见4个对象,且这4个对象都不能被修改
    public final static Season SPRING = new Season("春天","春风又绿江南岸");
    public final static Season SUMMER = new Season("夏天","映日荷花别样红");
    public final static Season AUTUMN = new Season("秋天","秋水共长天一色");
    public final static Season WINTER = new Season("冬天","窗含西岭千秋雪");
}

5. 示例代码Season2

package com.atguigu.javase.lesson9;

public enum Season2 {
    //枚举类的实例,需要在枚举类第一行列出
    SPRING("春天","春风又绿江南岸"),
    SUMMER("夏天","映日荷花别样红"),
    AUTUMN("秋天","秋水共长天一色"),
    WINTER("冬天","窗含西岭千秋雪");

    String SEASON_NAME;
    String SEASON_DESC;

    Season2(String seasonName,String seasonDesc){
        this.SEASON_NAME = seasonName;
        this.SEASON_DESC = seasonDesc;
    }
}

6. 示例代码Info接口

package com.atguigu.javase.lesson9;

public interface Info {
    String getInfo();
}

7. 示例代码Season3


package com.atguigu.javase.lesson9;

public enum Season3 implements Info{
    //枚举类的实例,需要在枚举类第一行列出
    SPRING("春天","春风又绿江南岸"),
    SUMMER("夏天","映日荷花别样红"),
    AUTUMN("秋天","秋水共长天一色"),
    WINTER("冬天","窗含西岭千秋雪");

    String SEASON_NAME;
    String SEASON_DESC;

    Season3(String seasonName, String seasonDesc){
        this.SEASON_NAME = seasonName;
        this.SEASON_DESC = seasonDesc;
    }


    @Override
    public String getInfo() {
        switch(this){
            case SPRING:return "A";
            case SUMMER:return "B";
            case AUTUMN:return "C";
            case WINTER:return "D";
        }
        return null;
    }
}

8. 示例代码Season4

package com.atguigu.javase.lesson9;

public enum Season4 implements Info{
    //枚举类的实例,需要在枚举类第一行列出
    SPRING("春天","春风又绿江南岸") {
        @Override
        public String getInfo() {
            return "^^A";
        }
    },
    SUMMER("夏天","映日荷花别样红") {
        @Override
        public String getInfo() {
            return "^^B";
        }
    },
    AUTUMN("秋天","秋水共长天一色") {
        @Override
        public String getInfo() {
            return "^^C";
        }
    },
    WINTER("冬天","窗含西岭千秋雪") {
        @Override
        public String getInfo() {
            return "^^D";
        }
    };

    String SEASON_NAME;
    String SEASON_DESC;

    Season4(String seasonName, String seasonDesc){
        this.SEASON_NAME = seasonName;
        this.SEASON_DESC = seasonDesc;
    }
}

9. 示例代码EnumTestTest

package test.com.atguigu.javase.lesson9; 

import com.atguigu.javase.lesson9.Season2;
import com.atguigu.javase.lesson9.Season3;
import com.atguigu.javase.lesson9.Season4;
import org.junit.Test;
import org.junit.Before; 
import org.junit.After; 

/** 
* EnumTest Tester.
 * 关于枚举:
 * 1.定义:一个类的对象是个数有限而且属性固定的。
 *
 * 2.手动定义枚举类:
 * 2.1.私有化构造器
 * 2.2.属性使用final来修饰
 * 2.3.在类的内部创建枚举类的对象,且使用public static final修饰
 * 2.4.提供一些工具方法:values(), valueOf()....
 *
 * 3.使用enum关键字定义枚举类
 * 3.1.使用enum替代class声明一个类
 * 3.2.枚举类对象的声明必须放在枚举类的第一行,声明对象的同时即是创建枚举类对象的过程。
 * 3.3.若有属性,需使用private final修饰,使其变为常量
 * 3.4.构造器默认使用private修饰。
 *
 * 4.枚举类的常用的方法
 * 4.1.values()得到所有枚举类对象的集合。
 * 4.2.valueOf(Class<T> enumType, String name):根据传入的字符串得到对应enumType类型的枚举类的对象
 * 5.实现接口的枚举类
 * 5.1.统一在一个方法中提供各个枚举类对象的实现,可以使用switch
 * 5.2.在声明对象的同时,提供方法的实现
 *
*/ 
public class EnumTestTest { 

    @Test
    public void testEnumMethod(){
        //1.遍历枚举类的方法:每个枚举类都有一个values()方法,返回枚举类对象的数组
        Season2[] seasons = Season2.values();
        for(Season2 season : seasons){
            System.out.println(season);
        }

        //2.把一个字符串转为对应的枚举类对象
        String input = "SPRING";
        //第一个参数是枚举类的类型,第二个参数是对应的字符串
        Season2 s = Enum.valueOf(Season2.class,input);
        System.out.println(s);
    }

    @Test
    public void testEnumAndInterface3(){
       System.out.println(Season3.AUTUMN.getInfo());
    }

    @Test
    public void testEnumAndInterface4(){
        System.out.println(Season4.AUTUMN.getInfo());
    }
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值