枚举类型name toString valueOf方法

网友投稿 279 2022-11-06

枚举类型name toString valueOf方法

枚举类型name方法的应用

Enum类型是Java语言中一种特殊的类型,它拥有一组固定的值,在开发中用得很多。常见的用法是定义一个枚举之后,给每一个枚举值定义一个code, 或者name的属性,来作为这个枚举值的唯一标识。还有一个字段message,用来保存这个枚举值的描述。例如下面这个动物枚举类:

public enum AnimalEnum2 {

DOG("dog", "狗"),

CAT("cat", "猫"),

;

private String code;

private String message;

AnimalEnum2(String code, String message) {

this.code = code;

this.message = message;

}

public static AnimalEnum2 getByCode(String code) {

for (AnimalEnum2 animalEnum2 : AnimalEnum2.values()) {

if (animalEnum2.code.equals(code)) {

return animalEnum2;

}

}

return null;

}

}

如上代码段,一般还会有一个getByCode方法,用来根据code获取一个枚举值。

但是,有时候我们并不需要为枚举值定义那么多字段,比如可以用枚举值来代替code,因为它也是唯一的。那么这种情况下,应该如何实现根据一个字符串获取这个枚举类中的某一个枚举值呢?

答案是name()方法。这个方法会返回一个枚举值的字面量,比如上面Animal2.DOG的字面量就是"DOG"这个字符串。于是上面这个枚举类可以改写成下面这张形式:

public enum AnimalEnum {

DOG("狗"),

CAT("猫"),;

private String message;

AnimalEnum(String message) {

this.message = message;

}

public static void main(String[] args) {

System.out.println(AnimalEnum.DOG.name());

System.out.println(AnimalEnum.DOG.toString());

System.out.println(AnimalEnum.DOG.equals(AnimalEnum.valueOf("DOG")));

System.out.println(AnimalEnum.getByName("CAT"));

}

public static AnimalEnum getByName(String name) {

for (AnimalEnum animalEnum : AnimalEnum.values()) {

if (animalEnum.name().equals(name)) {

return animalEnum;

}

}

return null;

}

}

像上面这样,遍历所有的枚举值的时候,直接使用name()方法获取到当前的枚举值的名字,再合name进行比较,也可以找到对应的枚举值。

顺便说一下枚举类型的toString()方法。这个方法是继承自Object方法,但是在枚举类中,被重写为直接调用name()方法。所以如果我们不改写toString()方法的话,这两个方法是等价的。

但是Java官方推荐应该尽量自定义toString()方法。因为这样可以让不同的类有符合各自需要的说明。所以我们使用枚举的时候,也可以自定义toString()方法,以产生更加有意义的说明。

而name()方法,官方的说明是应该用在必须要准确获取枚举值的字面值的时候才使用。比如枚举类型自带的valueOf(String name)方法,其实也是一个根据name获取枚举值的方法。不过它在没有匹配的时候会抛出一个异常,而不是返回null。

所以如果我们仅仅是想根据name获取一个枚举值,并且希望没有匹配到就抛一个异常,我们可以不自己实现这个方法,而是直接使用自带的valueOf方法。

AnimalEnum.DOG

AnimalEnum animalEnum = AnimalEnum.DOG;

System.out.println("I have a" + animalEnum.name());

将打印

I have a DOGs

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:获取泛型值ParameterizedType
下一篇:Java11 中基于嵌套关系的访问控制优化问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~