国际象棋棋盘有64个格子,我们通过Tile类表示格子,通过构造函数,当我们构造一个新的tile实例时,对应的会产生一个tile坐标,这个坐标即为传递给构造函数的相应内容。我们把这个类定义为抽象类,只需在子类中定义即可。
我们还需要判断某个tile是否被占用,如果未被占用,需要返回null。我们创建EmptyTile类表示空格子,它会调用父类的构造函数。
第一版:tile=OccupiedTile+EmptyTile
将格子分为被占用和未被占用两类(注意tile是抽象类不能被实例化)
public abstract class Tile { protected final int tileCoordinate; private Tile(int tileCoordinate){ this.tileCoordinate = tileCoordinate; } public abstract boolean isTileOccupied(); public abstract Piece getPiece(); //piece类后在后面定义 public static final class EmptyTile extends Tile { EmptyTile(final int coordinate){ super(coordinate); } @Override //重写以下方法 public boolean isTileOccupied(){ return false; } public static final class OccupiedTile extends Tile { private final Piece pieceOnTile; OccupiedTile(int tileCoordinate, Piece pieceOnTile){ super(tileCoordinate);//调用父类建立顶部坐标的构造函数 this.pieceonTile = pieceOnTile; } @Override public boolean isTileOccupied(){ return true; } @Override public Piece getPiece(){ return this.pieceOnTile; } }//定义被占领的格子
在Tile类中声明一个新的数字字段整数:
private static final MapEMPTY_TILES_CACHE = createAllPossibleEmptyTiles(); private static Map createAllPossibleEmptyTiles(){ final Map emptyTileMap = new HashMap<>(); for(int i = 0; i < 64; i++){ emptyTileMap.put(i, new EmptyTile(i)); } Collections.unmodifiableMap(emptyTileMap);//依赖的新库为谷歌第三方库(guava-18.0番石榴) return ImmutableMap.copyOf(emptyTileMap); } public static Tile createTile(final int tileCoordinate,final Piece piece){ return piece != null ? new OccupiedTile(tileCoordinate, piece) : EMPTY_TILES_CACHE.get(tileCoordinate); }
Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。
Map讲解
createTile解释:使构造函数私有化,将格子坐标传入,返回时进行判断。通过这个方法,任何人都可以在类上创建实例。
视频链接
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)