java中的枚举类型

目录

什么是枚举?

多例模式的类:

枚举类的使用:

关于枚举类型的几点总结:


什么是枚举?

枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。

多例模式的类:

首先我们写一个多例模式的类:

/**
 * Create by ZwZ
 * DateTime:2018/10/25 16:50
 * Description :多例模式中的多例类可以有多个实例,而且多例类必须自己创建、管理自己的实例,并向外界提供自己的实例。
 */
//枚举类
public class Season {
    private final String name;//季节名字
    private final String desc;//季节描述
    //私有化构造方法
    private Season(String name,String desc){
         this.name = name;
         this.desc = desc;
    }
    //向外界提供得到属性的方法
    public String getName() {
        return name;
    }
    public String getDesc() {
        return desc;
    }
    //创建枚举类的对象(用全大写表示常量)
    public static Season SPRING = new Season("spring","春暖花开");
    public static Season SUMMER = new Season("summer","夏日炎炎");
    public static Season AUTUMN = new Season("autumn","秋高气爽");
    public static Season WINTER = new Season("winter","白雪茫茫");
}

其中需要说明的就是:

以上这个类其实就可以看成一个枚举类,它用来给外界提供有限的对象;

其属性进行私有化就是一个封装的思想,使得其他类只能通过set方法对属性进行修改,而不是直接就可以进行更改。而这里没有set方法,因为我们这里写的是枚举类,是不希望其他类使用Season对象的时候对这些对象的属性进行修改的,所以使用final进行修饰;

其构造方法必须进行私有化,否则的话在其他类中可以new出来Season对象,所以这个多例模式就没有什么存在的意义了;

在此类中创建对象,用于其他类通过这个类拿到其特定的(枚举出来的)对象。所以要使用static修饰,而因为此对象的属性都是不可以修改的,可以理解成常量,所以取名字的时候使用全部大写的形式(完全可以不使用,但是这是一个代码规范问题)。

以上就写成了一个枚举类,用户只能通过这个类来得到特定的,有限的,对象。下面我们写一个测试类对其进行使用:

public class Test1 {
    public static void main(String[] args) {
        Season spring = Season.SPRING;
        String name = spring.getName();
        String desc = spring.getDesc();
        System.out.println(name + "" + desc);
    }
}

控制台打印输出的信息如下:

这便是枚举类的用法。如果我们在Test1的main方法中加上下面的代码:

Season season = new Season("四季如春","这是一个好的季节");

 就会报错:

'Season(java.lang.String, java.lang.String)' has private access in 'enumDemo.Season'

 也就是说,,构造方法被私有化了。在Test1这个类中是不能对其进行new的。

枚举类的使用:

上边我们已经看到了一个多例模式下的枚举类的书写方法。但是是比较麻烦的,在JDK5之后就提出了一个新的关键字:enum,专门来进行枚举类的构建。下面我们使用enum写一个和上边那个Season类有一模一样功能的类:

/**
 * Create by ZwZ
 * DateTime:2018/10/25 16:46
 * Description : how to use enum?
 */
public enum SeasonEnum {
    //在枚举类中规定,必须放在类的最前面  默认被public static修饰
    SPRING("spring","春暖花开"),
    SUMMER("summer","夏日炎炎"),
    AUTUMN("autumn","秋高气爽"),
    WINTER("winter","白雪茫茫");

    private final String name;//季节名字
    private final String desc;//季节描述
    private SeasonEnum(String name,String desc){
        this.name = name;
        this.desc = desc;
    }
    public String getName() {
        return name;
    }
    public String getDesc() {
        return desc;
    }
}

 以上这个类,在功能上是和Season一样的。以上类中的SPRING,SUMMER,AUTUMN,WINTER都是SeasonEnum类的对象,并且由public static进行修饰。其实使用enum修饰的SeasonEnum,在编译后也是会成为类似Season形式的类。但是这个是程序员不用操心的,你只管去使用就好。

关于枚举类型的几点总结:

1.枚举像一个类,又像一个数组

2.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例

3.所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义 变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值