JAVA中【enum】的使用

来源:互联网 发布:掌盟互娱zmaee软件下载 编辑:IT博客网 时间:2020/02/23 11:42

前言

此次主要是为了完成老师布置的任务:
写一个石头剪刀布的游戏,一开始使用数字代替了石头剪刀布,后来老师说用枚举可以写的更漂亮。

然后我就试了一下,在此作为记录,方便日后查看枚举是怎么用的(逃

参考书是:
《JAVA2核心技术卷1·基础知识(第七版)》
不确定有没有中文,我学校图书馆只有英文的- -

实现功能

一个玩家出拳
一个AI随机出拳
判断胜负(逃

谈谈枚举类型

在前文提及的实现需求中,使用普通变量的做法是分别将“剪刀”、“石头”、“布”分别设为一个特定的值如1、2、3。
又或者使用字符串存储用户的选择再进行判断。

我提及的参考书中谈到,这样的做法有可能让变量持有错误的值。(It is too easy for a variable to hold a wrong value.)

例如我现在的需求是要该整形变量只能为1、2、3。
或者只要该字符串变量为剪刀、石头、布这三个值。

如果让用户输入,用户可没那么听话,会输入错误的值,这时我们需要做一段啰里啰唆的验证。。数字还好,字符串则要做各种各样的验证,岂不是神烦?

而枚举类型的变量呢,它就让我们省心了。

你限定它只能是哪几个值,如果想存其他值进去就会报异常。

类似于你想登录一个网站,必须先注册,没注册的进不去。

一个简单的例子

import java.util.Scanner;public class BaseClass {    public enum Skill {        石头, 剪刀, 布;    }    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        String input = in.next();        //使用Enum类的valueOf转换。String也有valueOf方法,应该不陌生        Skill skill = Enum.valueOf(Skill.class, input);        System.out.println("skill=" + skill);    }}

输出结果:

剪刀skill=剪刀ooxxException in thread "main" java.lang.IllegalArgumentException: No enum constant FingerGuess.BaseClass.Skill.ooxx

可以看到,这里限定Skill类只能有3个值。
输入ooxx就会抛异常,如此就很方便的限定了一个变量所能存储的值。

再谈枚举类

public enum Skill { 石头, 剪刀, 布; }

Skill其实是一个类, 而石头、剪刀、布则是该类自身的三个实例。

如果我们给Skill的构造方法添加参数,那三个实例必然也需要传递参数。

举个例子:

import java.util.Scanner;public class SimplyDemo {    public enum Skill {        石头(1), 剪刀(2), 布(3);        Skill(int sign) {            this.sign = sign;        }        public int getSign() {            return sign;        }        private int sign;    }    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        String choose = in.next();        Skill s1 = Enum.valueOf(Skill.class, choose);        System.out.println(s1);        System.out.println(s1.getSign());    }}

结果是

输入:石头输出:石头1

另外,这个类的内部是不会构造出新对象的,所以即使值看起来是字符串,都可以直接用==来判断两个值是否相等而不用equals。

举个例子:

Skill s1 = Enum.valueOf(Skill.class, "石头");Skill s2 = Enum.valueOf(Skill.class, "剪刀");System.out.println(s1 == s2);s2 = Skill.石头;System.out.println(s1 == s2);

上面代码的结果将会是

falsetrue

以上,然后我就愉快的写作业去了。

END

0 0
原创粉丝点击