java枚举在项目中的使用,Java enum枚举在现实项目中的常用方式

在项目现实开发过程中,经常会遇到对某些牢固的值、字典项的界说的需求,许多项目经常使用常量来界说,其实在jdk1.5就已经引入了枚举,使用枚举可以更好的解决这类需求,本文主要纪录枚举的优势以及经常在项目中使用的方式。

知识点

枚举类命名

枚举类的命名通常需要Enum为后缀,枚举成员名称需要全大写,单词间用下划线离隔。

枚举类不允许使用 extends 关键字

枚举类默认会继续java.lang.Enum,由于java是单继续,以是在界说枚举类时不允许再继续其他类,但可以实现多个接口

枚举的对照可以直接使用 ==

枚举是不允许被new出来的,枚举类里的组织函数都限定为私有化,是不允许使用public界说组织函数的。枚举的赋值,若是是同一个元素,则会指向同一个地址,以是是可以直接使用==的,当然在Enum类中,重写了equals方式(如下图),以是也是可以用equals来判断。

4c00332822a60d5fa9599d02b597dab5.png

枚举常用方式

方式名

用途

name()

返回枚举常量名

toString()

返回枚举常量名

values()

返回枚举成员数组

valueOf()

通过枚举常量名返回枚举

ordinal()

返回枚举常量在enum声明中的位置,位置是从0最先计数的

枚举在switch中的使用

枚举在switch中的使用,优势在于能控制case的局限(看以下实例),并且在idea中有相关提醒

枚举在单例模式的使用

首先使用枚举类实现单例模式,写法相当简朴,看最后的实例;其次枚举是线程平安、单一实例(由于组织方式都是私有的,不能被new)

实例

1. 最简朴的枚举

在项目中经常会遇到一些牢固值的界说,以往都是用常量来界说,以下用实例说明,为啥枚举的方式优于常量的方式,以下就以季节的界说为例

1.1 使用常量来实现

/**

* @Description: 季节常量界说

*/

public class SeasonConst {

/**

* 春季

*/

public static final String SPRING = "SPRING";

/**

* 夏日

*/

public static final String SUMMER = "SUMMER";

/**

* 秋季

*/

public static final String AUTUMN = "AUTUMN";

/**

* 冬季

*/

public static final String WINTER = "WINTER";

}

以上实例虽然实现了功效,但有两点对照显著的瑕玷:

常量值容易写错(特别是复制黏贴,然则遗忘改对应的值,导致系统出bug),idea不会给任何提醒。

好比,某人粗心,在复制黏贴代码时酿成(将春季、夏日都界说成春季了):

/**

* 春季

*/

public static final String SPRING = "SPRING";

/**

* 夏日

*/

public static final String SUMMER = "SPRING";

若是我想知道一年总共多少个季节,咋整?用常量界说的类,有点左支右绌

1.2 使用枚举来实现,可以实现常量的所有功效,并能轻松解决以上提出的常量的两个瑕玷

界说枚举类SeasonEnum

public enum SeasonEnum {

/**

* 春季

*/

SPRING,

/**

* 夏日

*/

SUMMER,

/**

* 秋季

*/

AUTUMN,

/**

* 冬季

*/

WINTER

}

在SeasonEnum枚举类中,若是界说两个 SPRING,编译器会直接报错,很好解决了常量的第一个瑕玷

该枚举类的使用(1、获取枚举值的名称;2、枚举判断的使用;3、枚举循环的使用。通过枚举的循环,很好解决了常量的第二个瑕玷;)

//获取枚举值的名称,与toString获得的效果一样

String spring = SeasonEnum.SPRING.name();

System.out.println(spring);

//枚举判断的使用

SeasonEnum springEnum1 = SeasonEnum.SPRING;

SeasonEnum springEnum2 = SeasonEnum.SPRING;

SeasonEnum summerEnum3 = SeasonEnum.SUMMER;

//由于springEnum1、springEnum2都指向SPRING,以是输出true

System.out.println("springEnum1 == springEnum2:" + (springEnum1 == springEnum2));

//由于springEnum1指向SPRING、summerEnum3指向SUMMER,以是输出false

System.out.println("springEnum1 == summerEnum3:" + (springEnum1 == summerEnum3));

//循环枚举,打印枚举类中的所有枚举成员

SeasonEnum[] seasonEnums = SeasonEnum.values();

for (SeasonEnum seasonEnum : seasonEnums) {

System.out.println(seasonEnum.name());

}

枚举在switch中的使用,若是case后跟不存在SeasonEnum类中的枚举(好比 case OTHER),则编译器会报错

String enumName = "SPRING";

SeasonEnum seasonEnum = SeasonEnum.valueOf(enumName);

switch (seasonEnum){

case SPRING:

System.out.println(seasonEnum.name());

break;

case SUMMER:

System.out.println(seasonEnum.name());

break;

case AUTUMN:

System.out.println(seasonEnum.name());

break;

case WINTER:

System.out.println(seasonEnum.name());

break;

default:

System.out.println("other");

}

2.在枚举中使用自界说属性和方式

项目中经常也会遇到一些字典项的界说,好比性别,包罗存入数据库中的值,以及显示在页面上的值。以下通过实例来实现性别字典。

界说SexEnum(注重看代码中的注解)

public enum SexEnum {

MAN("man","男"),

WOMEN("women","女");

private String sexCode;

private String sexName;

/**

* 自界说组织函数,以完成枚举对sexCode、sexName赋值

* @param sexCode

* @param sexName

*/

SexEnum(String sexCode,String sexName){

this.sexCode = sexCode;

this.sexName = sexName;

}

/**

* 获取sexCode

* @return

*/

public String getSexCode() {

return sexCode;

}

/**

* 获取sexName

* @return

*/

public String getSexName() {

return sexName;

}

/**

* 项目中经常会凭据code,转换成对应的name

* 以是这里自界说方式,凭据sexCode获取sexName

* 通过循环enum来实现

* @param sexCode

* @return

*/

public static String getSexNameByCode(String sexCode){

String sexName = "sexCode不存在";

SexEnum[] sexEnums = SexEnum.values();

for (SexEnum sexEnum : sexEnums) {

if(sexEnum.getSexCode().equals(sexCode)){

sexName = sexEnum.getSexName();

break;

}

}

return sexName;

}

/**

* 项目中也有凭据name,转换成对应的code

* 以是这里自界说方式,凭据sexName获取sexCode

* 通过循环enum来实现

* @param sexName

* @return

*/

public static String getSexCodeByName(String sexName){

String sexCode = "sexName不存在";

SexEnum[] sexEnums = SexEnum.values();

for (SexEnum sexEnum : sexEnums) {

if(sexEnum.getSexName().equals(sexName)){

sexCode = sexEnum.getSexCode();

break;

}

}

return sexCode;

}

/**

* 凭据sexCode获取SexEnum,在switch中使用

* 通过循环enum来实现

* @param sexCode

* @return

*/

public static SexEnum getEnumByCode(String sexCode){

SexEnum[] sexEnums = SexEnum.values();

for (SexEnum sexEnum : sexEnums) {

if(sexEnum.getSexCode().equals(sexCode)){

return sexEnum;

}

}

return null;

}

/**

* 重写toString方式

* @return

*/

@Override

public String toString() {

return this.sexCode + ":" + this.sexName;

}

}

SexEnum枚举类的使用

public class EnumMain {

public static void main(String[] args){

//循环带自界说方式的枚举

SexEnum[] sexEnums = SexEnum.values();

for (SexEnum sexEnum : sexEnums) {

System.out.println("sexCode:"+sexEnum.getSexCode());

System.out.println("sexName:"+sexEnum.getSexName());

System.out.println("sexCode:sexName="+sexEnum.toString());

}

//凭据sexCode获取sexName

String sexName = SexEnum.getSexNameByCode("women");

System.out.println("凭据sexCode获取sexName:" + sexName);

//凭据sexName获取sexCode

String sexCode = SexEnum.getSexCodeByName("男");

System.out.println("凭据sexName获取sexCode:" + sexCode);

//通过传入的sexCode使用switch

testSexEnumSwitch("women");

}

/**

* 现实项目中,基本上都是传sexCode的,以是这里也凭据传入的sexCode,使用switch方式

* @param sexCode

*/

private static void testSexEnumSwitch(String sexCode){

//自界说getEnumByCode方式,通过sexCode获取SexEnum

SexEnum sexEnum = SexEnum.getEnumByCode(sexCode);

switch (sexEnum){

case MAN:

System.out.println(sexEnum.toString());

break;

case WOMEN:

System.out.println(sexEnum.toString());

break;

default:

System.out.println("other");

}

}

}

3.通过枚举实现单例

单例界说

public enum Singleton {

INSTALL;

/**

* 自界说方式

*/

public void yourMethod(){

System.out.println("do your business");

}

}

挪用方式

Singleton.INSTALL.yourMethod();

源码获取

以上示例都可以通过我的GitHub获取完整的代码,点击获取

原文链接:https://www.cnblogs.com/mingsay/p/12390900.html

本站声明:网站内容来源于网络,若有侵权,请联系我们,我们将及时处理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值