上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界面中,那么该棋子枚举类就不得不更改了。
虽然本章是为了做一个较为简单的五子棋程序,但更多地是想向大家展现面向对象的思维。