在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象;再比如行星类,目前只有8个对象,这些实例有限而且固定的类,在Java中被称为枚举类。而且枚举类更加直观,类型安全。
- 简单的枚举类
我们首先看一下使用普通方式定义四季,我们会发现这样定义比较复杂且繁琐。这样的定义方式并没有什么错,但它存在许多不足,如在类型安全和使用方便性上并没有多少好处,如果存在定义int值相同的变量,混淆的几率还是很大的,编译器也不会提出任何警告,因此这种方式在枚举出现后并不提倡。
public static final int SPRING =1;
public static final int SUMMER=2;
public static final int FALL=3;
public static final int WINTER=4;
}
我们在看一下用枚举类来定义,可以说是相当简洁了,在定义枚举类型时我们使用的关键字是enum,与class关键字类似,只不过前者是定义枚举类型,后者是定义类类型。枚举类型Day中分别定义了四季的值,这里要注意,值一般是大写的字母,多个值之间以逗号分隔。同时我们应该知道的是枚举类型可以像类(class)类型一样,定义为一个单独的文件,当然也可以定义在其他类内部,更重要的是枚举常量在类型安全性和便捷性都很有保证。
public enum SeasonEnum {
SPRING,SUMMER,FALL,WINTER;
}
enum和class、interface的地位一样。枚举类可以实现一个或多个接口。枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器。使用enum定义、非抽象的枚举类默认使用final修饰,不可以被继承。 枚举类的构造器只能是私有的。
- 枚举类介绍
枚举类内也可以定义属性和方法,可是是静态的和非静态的。我们来看看以下的代码示例:
public enum SeasonEnum {
SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天");
private final String name;
private SeasonEnum(String name)
{
this.name = name;
}
public String getName() {
return name;
}
}
下面通过一个代码实现展示一下枚举类的使用情况:
public class SeasonTest {
public void judge(SeasonEnum s)
{
switch(s)
{
case SPRING:
System.out.println("春天适合踏青。");
break;
case SUMMER:
System.out.println("夏天要去游泳啦。");
break;
case FALL:
System.out.println("秋天一定要去旅游哦。");
break;
case WINTER:
System.out.println("冬天要是下雪就好啦。");
break;
}
}
public static void main(String[] args) {
SeasonEnum s = SeasonEnum.SPRING;
SeasonTest test = new SeasonTest();
test.judge(s);
}
}
- 扑克牌代码
我们使用枚举内部类,定义poker类花色,完成poker类name的赋值。代码如下:
private int value;//值
private String name;//名字
private Type type;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Type getType() {
return type;
}
public void setType(Type type) {
this.type = type;
}
public static enum Type{
黑桃(4),红桃(3),草花(2),方片(1);
private int v;
Type(int v){
this.v=v;
}
public int getV() { return v;
}
}
public String toString() {
return "Poker ["+ name +"]";
}
public int compareTo(Pokers o) {
if(this.getValue()==o.getValue())
return this.getType().getV()-o.getType().getV();
return this.getValue()-o.getValue();
}
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class TestPokers {
public static void main(String[] args) {
Pokers [] pokerBox=new Pokers[52];
Set<Pokers> pk=new HashSet<Pokers>();
ArrayList<Pokers> li=new ArrayList<Pokers>();
int index=0;
for(int i=1;i<=13;i++){
for(Pokers.Type pt:Pokers.Type.values()){
Pokers p=new Pokers();
p.setValue(i);//设置值1~13
p.setType(pt);// 设置花色4个
switch(i){
case 1:p.setName(pt.name()+"A");break;
case 11:p.setName(pt.name()+"J");break;
case 12:p.setName(pt.name()+"Q");break;
case 13:p.setName(pt.name()+"K");break;
default : p.setName(pt.name()+i); }
pokerBox[index++]=p;
pk.add(p);
li.add(p);
}
}
for(Pokers p:pokerBox){
System.out.println(p.getName());
}
int result=compare(pokerBox[0],pokerBox[1]);
System.out.println(result+" ==");
System.out.println(pk);
Collections.sort(li);
Collections.shuffle(li);
System.out.println(li);
}
public void sort(List<Pokers> pokers){
Collections.sort(pokers);
}
public static int compare(Pokers p1,Pokers p2){
if(p1.getValue()==p2.getValue()){
return p1.getType().getV()-p2.getType().getV();
}
else return p1.getValue()-p2.getValue(); }
}
运行结果如下:
本次博客的编写查阅了许多资料,但是还是不甚明白,有许多疑惑之处。所以最后的结果中并没有把所有的要求一一实现,课后会花更多的时间来解决这些问题的。然后在空闲时间把其他功能完善。