疯狂Java实战演义
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.5 棋子枚举类实现

在某些情况下,一个类的属性是有限而且固定的,例如本章中的棋子类,它只有两个对象,黑棋和白棋。这种实例有限而且固定的类,在Java中称为枚举类,枚举类的关键字用enum而不是class。此类中有两个枚举属性BLACK和WHITE,代表黑子与白子,代码实现如下。

代码清单:code\gobang\src\org\crazyit\gobang\Chessman.java

    public enum Chessman {
        BLACK("●"),WHITE("○");
        private String chessman;
        /**
        * 私有构造器
        */
        private Chessman(String chessman) {
            this.chessman = chessman;
        }
        /**
        * @return 黑棋或者白棋
        */
        public String getChessman() {
            return this.chessman;
        }
    }

在上面的代码中,可以看到,枚举类是用enum关键字代替了class关键字,此枚举类的构造器的权限修饰符是private,表明此类是不可以通过外部创建的,只能在此类的内部创建,这是为了保证此对象只有黑子与白子两种类型。黑体代码列出了枚举值,实际上就是调用私用构造器创建此对象,等同于以下代码:

    public static final Chessman BLACK = new Chessman("●");
    public static final Chessman WHITE = new Chessman("○");

由于BLACK与WHITE两个属性是静态的,所以要获取黑子或者白子,可以使用以下代码:

    Chessman.BLACK.getChessman();
    Chessman.WHITE.getChessman();

在控制台中,我们可以使用这种方式来确定棋子的字符串,如果需要在Swing或者其他界面中展示一颗棋子,可能需要为具体的某颗棋子保存相应的棋子图片,在本章中,由于棋子只是普通的两个字符串,因此直接写成枚举对象即可。

如果你希望你的程序有更好的可扩展性,笔者建议可以根据情况建立棋子接口,并提供白棋与黑棋的实现类,我们在棋盘二维数组中存放的只是某个接口,而不是具体的类,这样就提高了程序的可扩展性。在本小节的开头提到:在某些情况下,一个类中的属性是有限并且固定的。但是在实际的开发情况中(特别是做企业应用),随着业务的不断变化,类不可变几乎是不可能的。举个例子,如果需要将本章中的五子棋迁移到Swing界面中,那么该棋子枚举类就不得不更改了。

虽然本章是为了做一个较为简单的五子棋程序,但更多地是想向大家展现面向对象的思维。