1.一个类的实例是有限且固定的,这个类称为枚举类。比如季节类,只有四个对象(春、夏、秋、冬)

2.手动实现一个枚举类
(1)通过private将构造器隐藏起来
(2)把这个类的所有可能实例都使用private static final修饰的类变量来保存。
(3)如果有必要,可以提供一些静态方法。

package cn.it.lsl;

public class Season {
private final String name;
private final String desc;
private Season(String name, String desc){
this.name = name;
this.desc = desc;
}
public static final Season SPRING = new Season("春天","踏青");
public static final Season SUMMER = new Season("夏天","夏日炎炎");
public static final Season FAIL = new Season("秋天","秋高气爽");
public static final Season WINTER = new Season("冬天","白雪皑皑"); public String getName(){
return this.name;
}
public String getDesc(){
return this.desc;
}
}
package cn.it.lsl;

public class SeasonTest {
public SeasonTest(Season s){
System.out.println(s.getName() + "," + s.getDesc());
}
public static void main(String[] args) {
new SeasonTest(Season.FAIL);
}
}

Season类是一个不可变类。Season类中包含了4个static final常量的Field,这4个常量Field就代表了该类所能创建的对象。当程序需要调用Season对象时,就可以通过Season.SPRING的方式来取得Season对象。

这里顺便复习一下不可变类
不可变类:创建该类的实例后,该实例的Field是不可改变的。
如果要创建自定义的不可变类,需遵循如下规则:
(1)使用private和final修饰符来修饰该类的Field。
(2)提供带参数的构造函数,用于根据传入参数来初始化类里的Field。
(3)仅为该类的Field提供getter方法,不要为该类的Field提供setter方法。
(4)如果有必要,重写Object类的hashCode和equals方法。

3.枚举类
(1)使用enum关键字定义枚举类。枚举类一样可以有自己的Field、方法,可以实现一个或多个接口,也可以有自己的构造器。
(2)使用eunm定义的枚举类默认继承了java.lang.Enum类,而不是继承Object类。
(3)使用enum定义、非抽象的枚举类默认会使用final修饰,因此枚举类不能派送子类。(并不是所有的枚举类都使用final修饰,如抽象枚举类)
(4)枚举类所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远不能产生实例。
(5)所有枚举类都提供一个values方法,该方法可以方便地遍历所有枚举值。

package cn.lsl;

public enum SeasonEnum {
SPRING,SUMMER,FALL,WINTER;
}
package cn.lsl;

public class EnumTest {

    public void judge(SeasonEnum s){
switch(s){
case SPRING:
System.out.println("春天");
break;
case SUMMER:
System.out.println("夏天");
break;
case FALL:
System.out.println("秋天");
break;
case WINTER:
System.out.println("冬天");
break;
}
}
public static void main(String[] args) {
//列出所有枚举类的实例
for(SeasonEnum s : SeasonEnum.values()){
System.out.println(s);
} new EnumTest().judge(SeasonEnum.FALL);
}
}

4.枚举类的Field、方法

枚举类可以定义自己的Field和方法。

package cn.lsl;

public enum Gender {
MALE,FEMALE;
public String name;
}
package cn.lsl;

public class GenderTest {
public static void main(String[] args) {
//通过Enum的valueOf方法来获取指定枚举类的枚举值
Gender g = Enum.valueOf(Gender.class, "FEMALE");
g.name = "女";
System.out.println(g + "," + g.name);
}
}

在上面程序中产生Gender对象的方式与普通类不同,而是采用通过Enum的valueOf方法来获取指定枚举类的枚举值,枚举类的实例只能是枚举值,而不是随意通过new来创建的。

其实上面程序中,没有实现java的良好封装,因为name的访问权限是public,这样就会出现随意对name赋值的情况,应该通过方法来控制对name的访问。

改造上面的程序

package cn.lsl;

public enum Gender {
MALE,FEMALE;
public String name;
public void setName(String name){
switch(this){
case MALE:
if(name.equals("男")){
this.name = name;
}else{
System.out.println("参数错误");
return;
}
break;
case FEMALE:
if(name.equals("女")){
this.name = name;
}else{
System.out.println("参数错误");
return;
}
break;
}
}
public String getName(){
return this.name;
}
}
package cn.lsl;

public class GenderTest {
public static void main(String[] args) {
//通过Enum的valueOf方法来获取指定枚举类的枚举值
Gender g = Enum.valueOf(Gender.class, "FEMALE");
g.setName("女");
System.out.println(g + "," + g.getName());
g.setName("男");
System.out.println(g + "," + g.getName());
}
}

定义枚举类,以上的做法还是做的不够好,枚举类通常应该设计不可变类。其Field值不应该允许改变,这样会更安全。

所以枚举类的Field都应该使用private final修饰。

package cn.lsl;

public enum Gender {
MALE("男"),FEMALE("女");
private final String name;
private Gender(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}

5.实现接口的枚举类

枚举类可以实现一个或多个接口。

package cn.it.lsl;

public interface GenderDesc {
void info();
}
package cn.it.lsl;

public enum Gender implements GenderDesc{
MALE("男"),FEMALE("女");
private final String name;
private Gender(String name){
this.name = name;
} public String getName(){
return this.name;
} @Override
public void info() {
// TODO Auto-generated method stub
System.out.println("枚举类实现接口");
} }

以上在枚举类里面实现接口的方法时,每个枚举值在调用该方法的时候都会有相同的行为(即方法体相同)。
如果需要每个枚举值在调用该方法时表现出不同的行为方式,应该让每个枚举值分别实现该方法。

package cn.it.lsl;

public enum Gender implements GenderDesc{
MALE("男"){
public void info() {
// TODO Auto-generated method stub
System.out.println("枚举类实现接口,男");
}
},
FEMALE("女"){
public void info() {
// TODO Auto-generated method stub
System.out.println("枚举类实现接口,女");
}
};
private final String name;
private Gender(String name){
this.name = name;
} public String getName(){
return this.name;
}
}

6.包含抽象方法的枚举类

在枚举类中定义抽象方法的时候不能使用abstract关键字将枚举类定义成抽象类(因为系统会自动为它添加abstract关键字),因为枚举类需要显示创建枚举值,而不是作为父类,所以定义每个枚举值时必须为抽象方法提供实现。

以下一个程序在枚举类中定义了一个抽象方法,这个抽象方法由不同的枚举值提供不同的实现

package cn.it.lsl;

public enum Operation {
PLUS{
@Override
public double eval(double x, double y) {
// TODO Auto-generated method stub
return x + y;
}
},
MINUS{
@Override
public double eval(double x, double y) {
// TODO Auto-generated method stub
return x - y;
}
},
TIMES{
@Override
public double eval(double x, double y) {
// TODO Auto-generated method stub
return x * y;
}
},
DIVIDE{
@Override
public double eval(double x, double y) {
// TODO Auto-generated method stub
return x / y;
}
};
public abstract double eval(double x, double y); public static void main(String[] args) {
System.out.println(Operation.PLUS.eval(2, 3));
System.out.println(Operation.MINUS.eval(2, 3));
System.out.println(Operation.TIMES.eval(2, 3));
System.out.println(Operation.DIVIDE.eval(2, 3));
}
}

Java笔记:枚举类的更多相关文章

  1. Java笔记---枚举类和注解

    Java笔记---枚举类和注解 一.枚举类 自定义枚举类 方式一:JDK5.0之前自定义枚举类 class Seasons { //1. 声明Seasons对象的属性 private final St ...

  2. Java学习——枚举类

    Java学习——枚举类 摘要:本文主要介绍了Java的枚举类. 部分内容来自以下博客: https://www.cnblogs.com/sister/p/4700702.html https://bl ...

  3. Java学习笔记-枚举类

    实例有限且固定的类成为枚举类 枚举类的实现 早期时候的实现形式: public static final int SEASON_SPRING = 1; public static final int ...

  4. Java疯狂讲义笔记——枚举类

    枚举类 ——Java5[基础知识]1,定义枚举类——关键字 enum (地位与class.interface相同).2,枚举类是一个特殊的类,可以有成员变量.方法,实现一个或多个接口,定义自己的构造器 ...

  5. java笔记--枚举总结与详解

    由于工作原因,已经有两礼拜没有更新博客了,好不容易完成了工作项目,终于又可以在博客园上愉快的玩耍了. 嗯,今天下午梳理了一下关于java枚举的笔记,比较长,不过还是觉得挺厚实的,哈哈,有出入的地方,欢 ...

  6. 【Java】 枚举类

    如果要定义一个枚举类: public enum Size { SAMLL, MEDIUM, LARGE, EXTRA, EXTRA_LARGE}; 实际上,这个声明定义的类型是一个类,它刚好有4个实例 ...

  7. java中枚举类的实际应用

    知识点:在Java中,使用枚举类,当遇到实例类型有限的类时,并且数据库中用状态码代表一种含义时,如星期,性别,员工登陆某系统的状态等等, 可以考虑使用枚举类 本例子可以仿照,也可以使用自定义的类型处理 ...

  8. Java:枚举类也就这么回事

    目录 一.前言 二.源自一道面试题 三.枚举的由来 四.枚举的定义形式 五.Enum类里有啥? 1.唯一的构造器 2.重要的方法们 3.凭空出现的values()方法 六.反编译枚举类 七.枚举类实现 ...

  9. Java笔记--枚举&注解

    1.自定义枚举类的实现,例: class Season{ //1,提供类的属性,声明为rivate final private final String name; private final Str ...

  10. java基础---枚举类与注解

    一.枚举类 类的对象只有有限个,确定的.我们称此类为枚举类 如果枚举类中只有一个对象,则可以作为单例模式的实现方式. 定义枚举类 方式一:jdk5.0之前,自定义枚举类 public class Se ...

随机推荐

  1. 【百度地图API】你看过房产地图吗?你知道房产标注是如何建立的吗?

    原文:[百度地图API]你看过房产地图吗?你知道房产标注是如何建立的吗? 你是不是看过很多房产网站?例如安居客,新浪乐居. 你是不是也想做一个能写文字的标注? 你知道怎么去实现麼? 其实,上图这样的标 ...

  2. 【.NET特供-第三季】ASP.NET MVC系列:MVC与三层图形对照

    近期在开发小组在研究:BS项目中是利用'MVC框架'还是继续沿用'三层'的问题. 由于曾经的.NET项目大多数都是利用三层开发的,所以大多数人都可以对三层进行熟练地运用.而项目的開始我们也曾听说过MV ...

  3. 解决Win7下一个VC++6.0您不能直接打开多个project问题

    于Win7操作系统,只需双击打开多个VC ++6.0的project当文件,前方和后方的工作区将关闭工作区,这项.VC++6.0仅仅通过文件-->开放式工作区-->找到磁盘project档 ...

  4. Android SDK 2.2 离线安装

    android的普通安装方法非常easy,不必多说. 因为普通安装方法速度非常慢,对一般的用户要数小时的时间等待. 为更高速安装,能够採取离线安装方法.即,先分别下载所需包,再安装. 一,首先下载SD ...

  5. 如何为你的初创应用App开发公司建立战略计划(商业战略竞争五力学)

    首先,什么是战略计划?战略计划可以定义为一个为了达到目标而需要执行的一系列动作步骤的计划. 根据当今全球第一战略权威,商业管理界公认的"竞争战略之父"Michael Porter著 ...

  6. 记录一下Fedora21下安装Foundation5遇到的问题[尚有遗留问题]

    写在前面:之前安装过了gem,所以下面的步骤没有这一过程,再有就是忘记哪一步需要ruby中的一个.h文件.可以使用如下命令解决 sudo yum install ruby-devel ------ S ...

  7. QT自动补全设置

    在工具 -> 选项 -> 环境 -> 键盘 中,找到TextEditor -> CompleteThis,修改后面的快捷键就好了 我将它修改为Alt + /

  8. vs 文件头自动添加注释

    原文:vs 文件头自动添加注释 vs2010 C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates ...

  9. TableLayout中怎么填充相同的布局

    在Android界面xml文件中可以导入另一个xml文件,就能实现一个功能就是重复利用相同的xml布局 有两种方法进行处理: include引入 定义一个布局Tab_flag.xml <?xml ...

  10. vs2010下载链接中国简体(中国含msdn)

    昨天一个朋友说vs2010中国版可下载,我开始不相信.只是周末.所以,我下载一试 果然,安装了中国版,原本msdn订户才能够下载,感谢朋友们上传. 文件名 cn_visual_studio_2010_ ...