Java扑克牌的面向对象建模

本文深入探讨Java枚举类的定义与使用,对比传统定义方式的不足,展示枚举类在类型安全和便捷性上的优势。通过具体示例,如季节类和扑克牌类的实现,阐述枚举类的灵活性和强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有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(); }
}


运行结果如下:
在这里插入图片描述
本次博客的编写查阅了许多资料,但是还是不甚明白,有许多疑惑之处。所以最后的结果中并没有把所有的要求一一实现,课后会花更多的时间来解决这些问题的。然后在空闲时间把其他功能完善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值