前言
此次主要是为了完成老师布置的任务:
写一个石头剪刀布的游戏,一开始使用数字代替了石头剪刀布,后来老师说用枚举可以写的更漂亮。
然后我就试了一下,在此作为记录,方便日后查看枚举是怎么用的(逃
参考书是:
《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=剪刀
ooxx
Exception 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);
上面代码的结果将会是
false
true
END