java 枚举 扩展性_Enum类的介绍和使用

首先,我们总结一下枚举类的好处,再一层层去研究枚举类的用法:

好处1:如果使用static final属性而不使用枚举的话,可能在代码中出现强行去set属性的写法,在这里单独提出来,大家肯定会觉得不会发生这样的问题,现实开发中,是可能出现的,这时候就会报错,如果使用枚举类的话,因为枚举类无法通过外部去set,所以可以杜绝这样的情况。

好处2:static final扩展性较差,枚举的每一个属性我们都可以扩展属性,重写方法等等。

好处3:可以通过switch去判断,代码的简洁性更高

使用:

最最最最简单级:

先简单写一个枚举类,用enum做关键字声明这个类,然后写属性,注意这里要大写,之间用逗号隔开,这里如果后面没有内容,最后面的分号是可以不加的,但是我们统一规范,加上这个分号。

public enum Number {

ONE,TWO,THREE,FOUR;

}

然后我们写一个测试类

@Test

public void test01() {

Number one = Number.ONE;

}

这里我们看出,直接枚举类.属性就可以使用,我们这里需要注意一个细节,返回值是一个类,所以我们上面说的所有枚举类的属性都是错误的说法,实际上它是一个类,一个Number类,也就我们在枚举类里面其实是定义了一个又一个的新类。

简单级:

我们得到了一个Number类,我们自然就会去想着,调用一下它的方法:

bfed59e2ac4ac61d710c06b1d6f9564a.png

一眼看过去,大多数都是我们熟悉的,除了三个方法,name(),ordinal(),compareTo()。我们没有主动定义过他们。感兴趣的可以深究一下源码,这里直接就说结论了。

public void test01() {

//name就是枚举类里面定义的属性的名称

System.out.println(Number.ONE.name()); //ONE

System.out.println(Number.TWO.name()); //TWO

//ordinal就是枚举类里面对应属性的位置,排在第几位,从0开始

System.out.println(Number.ONE.ordinal()); // 0

System.out.println(Number.THREE.ordinal()); //2

// compareTo 就是用前面的一个枚举的ordinal去减后面的ordinal

System.out.println(Number.ONE.compareTo(Number.ONE)); // 0

System.out.println(Number.ONE.compareTo(Number.THREE)); //-2

System.out.println(Number.FOUR.compareTo(Number.ONE)); // 3

}

入门级:

上面我们讲的都是最基本的用法,接下来我们继续研究一下,枚举类的可扩展性。既然我们都知道在枚举类里面,我们其实是定义了一个又一个新的类。类的构造方法有无参和有参,我们只看见了无参,那么可以实现有参构造吗,答案是可以的,这就是枚举的可扩展性之一。一个Number类无法满足我们的需求,有人看不懂大写的单词,有的只会看中文,更有甚者,只认识数字,所以我们需要给他们展示小写的单词,中文和数字。我们来改写一下代码:

public enum Number {

ONE("one","一",1),

TWO("two","二",2),

THREE("three","三",3),

FOUR("four","四",4);

// 定义示例变量,这个才是Number类里面真正的属性

private String lowCase;//小写

private String chinese; //中文

private Integer digit; //数字

//构造函数,这里只能用private修饰

//注意,这里只能同时存在一种构造函数,因为目前是有参,所以我们得把枚举类,也就是上面的ONE,TWO也改成有参。

private Number(String lowCase,String chinese,Integer digit) {

this.lowCase = lowCase;

this.chinese = chinese;

this.digit = digit;

}

//getter/setter

public String getLowCase() {

return lowCase;

}

public String getChinese() {

return chinese;

}

public Integer getDigit() {

return digit;

}

public void setLowCase(String lowCase) {

this.lowCase = lowCase;

}

public void setChinese(String chinese) {

this.chinese = chinese;

}

public void setDigit(Integer digit) {

this.digit = digit;

}

}

这样,我们就得到了一个全新的Number枚举类,它具有扩展的属性。我们再来测试一下它扩展后的属性

public void test02() {

System.out.println(Number.FOUR.name()); //FOUR 没有变

System.out.println(Number.FOUR.ordinal());// 3 没有变

System.out.println(Number.ONE.getLowCase()); // 在构造的时候传的值 one

System.out.println(Number.TWO.getChinese()); // 二

System.out.println(Number.THREE.getDigit()); // 3

}

那么枚举类仅仅只能扩展属性吗?并不是,他还能扩展方法,我们只需要定义一个抽象方法即可:

public enum Number {

ONE("one","一",1){

@Override

public String getNextNumber() {

return "2";

}

},

TWO("two","二",2) {

@Override

public String getNextNumber() {

return "3";

}

},

THREE("three","三",3) {

@Override

public String getNextNumber() {

// TODO Auto-generated method stub

return "4";

}

},

FOUR("four","四",4) {

@Override

public String getNextNumber() {

// TODO Auto-generated method stub

return "5";

}

};

// 定义示例变量,这个才是Number类里面真正的属性

private String lowCase;//小写

private String chinese; //中文

private Integer digit; //数字

//构造函数,这里只能用private修饰

//注意,这里只能同时存在一种构造函数,因为目前是有参,所以我们得把枚举类,也就是上面的ONE,TWO也改成有参。

private Number(String lowCase,String chinese,Integer digit) {

this.lowCase = lowCase;

this.chinese = chinese;

this.digit = digit;

}

//定义一个抽象方法

public abstract String getNextNumber();

//getter/setter

public String getLowCase() {

return lowCase;

}

public String getChinese() {

return chinese;

}

public Integer getDigit() {

return digit;

}

public void setLowCase(String lowCase) {

this.lowCase = lowCase;

}

public void setChinese(String chinese) {

this.chinese = chinese;

}

public void setDigit(Integer digit) {

this.digit = digit;

}

}

这里我们就不测试了,感兴趣的小伙伴们自己测一下把。

以上就是本篇文章要介绍的东西,基本可以满足日常工作大部分需求了,如果以后有需要,再来做补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值