实现枚举的两种方式

一. 使用自定义方法实现枚举 :

1. 在自定义的枚举类中把构造方法私有化 , 这样做是为了不能通过构造方法去创建对象 , 只能使用本类中已经创建好的对象 ;

2. 不提供set方法, 因为枚举对象值通常为只读 ;

3. 在自定义的类中创建的对象通常使用static final来修饰 , 用static可以通过类名直接访问此对象, 用final是为了避免static静态属性初始化造成的类加载static代码块 ,  所以将static和final搭配使用 ;

public class Enum {
    public static void main(String[] args) {
        //输出自定义的四个对象
        System.out.println(Season.spring);
        System.out.println(Season.summer);
        System.out.println(Season.autumn);
        System.out.println(Season.winter);
    }
}

//自定义枚举实现
class Season
{
    private String name;
    private String desc;

    //(优化) 由于加上static会造成类加载,所以可以加上final避免:
    public static final Season spring=new Season("春天","温暖");
    public static final Season summer=new Season("夏天","炎热");
    public static final Season autumn=new Season("秋天","凉爽");
    public static final Season winter=new Season("冬天","寒冷");

    //私有化构造方法,这样可以避免通过构造方法自己创建对象
    private Season(String name,String desc)
    {
        this.name=name;
        this.desc=desc;
    }

    //自定义枚举避免更改对象属性值,去除set方法,只有get方法变为只读模式
    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

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

二. 使用enum关键字实现枚举类 :

1. 但使用enum关键字实现一个枚举类的时侯 , 默认会继承Enum类 , 而且enum这个类是一个final类 , 所以它不可以有子类;

2. 创建枚举对象(spring,summer,autumn,winter)时 , 必须要知道它调用的是哪个构造器 , 如果使用无参构造器创建枚举对象 ,  则实参列表和小括号都可以省略 ;

3. 有多个枚举对象时 , 要使用 " , " 来分隔开 , 最后有一个分号结尾 ;

4. 枚举对象必须写在枚举类的行首 ;

5. 即使使用enum去实现枚举类,这个枚举类中的枚举对象也是用static final 来修饰的 ; 

public class Enum {
    public static void main(String[] args) {
        //输出自定义的四个对象
        System.out.println(Season.spring);
        System.out.println(Season.summer);
        System.out.println(Season.autumn);
        System.out.println(Season.winter);
    }
}

//使用关键字enum实现枚举类:
enum Season
{
//    public static final Season spring=new Season("春天","温暖");
//    public static final Season summer=new Season("夏天","炎热");
//    public static final Season autumn=new Season("秋天","凉爽");
//    public static final Season winter=new Season("冬天","寒冷");
    //如果使用enum来实现枚举类:
    //1.使用关键字 enum 替代 class
    //2.不需要使用public static final Season spring=new Season("春天","温暖"),
    //  而是直接用spring("春天","温暖");
    //3.如果有多个常量(对象),则需要使用","来分隔 , 最后以";"结尾;
    //4.如果使用enum实现枚举,必须将枚举对象放在枚举类的行首,否则会报错;
    spring("春天","温暖"),summer("夏天","炎热"),
    autumn("秋天","凉爽"),winter("冬天","寒冷");


    private String name;
    private String desc;

    //私有化构造方法,这样可以避免通过构造方法自己创建对象
    private Season(String name,String desc)
    {
        this.name=name;
        this.desc=desc;
    }

    //自定义枚举避免更改对象属性值,去除set方法,只有get方法变为只读模式
    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

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

6. 当在这个enum枚举类中使用toString方法时 , 如果没有重写toString方法则默认会调用父类Enum中的toString方法 ; Enum类中的toString方法会返回enum枚举类中创建的枚举对象名name ;

三. 由于enum实现的枚举类继承了Enum类,所以也继承了Enum类中的方法 :

1. 以下是Enum中的成员 :

2. 以下代码是通过enum创建的枚举对象来调用父类Enum中的各个方法 :
public class EnumMethod {
    public static void main(String[] args) {
        //用autumn对象来接收Season中的静态常量枚举对象autumn:
        Season autumn = Season.autumn;
        
        //name() 表示输出该枚举对象的名字:
        System.out.println(autumn.name());
        
        //ordinal() 表示输出的是该枚举对象的次序/编号 ,从0开始编号,所以autumn应该是第2个:
        System.out.println(autumn.ordinal());
        
        //values() 会返回Season[]数组, 这个数组包含了所以枚举对象:
        Season[] value=Season.values();
        for(Season x:value)
        {
            System.out.println(x);
        }
        
        //valueOf : 将字符串转换成枚举对象,要求字符串必须为已有的常量,否则报错
        Season autumn1=Season.valueOf("autumn");
        System.out.println("autumn1= "+autumn1);
        
        //compareTo : 比较两个枚举常量,比较的就是编号ordinal() , 输出结果是两个编号相减的结果为2
        System.out.println(Season.autumn.compareTo(Season.spring));
        
    }
}

  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值