在开发过程中,难免碰到很多需要判断的属性,比如大家经常玩的麻将,就可能需要对胡牌类型进行判断,例如“大三元”、“大四喜”、“十三幺”等牌型。
正常情况下,我们可能会根据每种牌型都写一个判断方法,那么就出现了一个很严重的问题:国际麻将中近百种牌型,我们是否需要判断近百次?也许可以进行一些特殊判断再进入具体判断:例如判断是否都是顺子?那么可以排除一些例如“清幺九”、“清碰”等牌型。但是具体实现起来也是一个不得了的判断过程,所以我们可以使用枚举来进行做方法判断,最终提供给接口那边的应该只有一个判断。
直接上代码:
/**
* 特殊牌型判断之混幺九
* @param tiles
* @return
*/
public static MahJongWinOfTypeEnum hunYaoJiu(List<Tiles>tiles) {
int[]arr=Common.TilesToArrayInt(tiles);
for (int i = 0; i < arr.length; i++) {
if(arr[i]%10!=9&&arr[i]%10!=1&&arr[i]<40) {
return null;
}
}
return MahJongWinOfTypeEnum.hunYaoJiu;
}
/**
* 特殊牌型判断之清一色
* @param tiles
* @return
*/
public static MahJongWinOfTypeEnum qingYiSe(List<Tiles>tiles) {
for (int i = 0; i < tiles.size()-1; i++) {
if(!tiles.get(i).getTilesType().equals(tiles.get(i+1).getTilesType())) {
return null;
}
}
return MahJongWinOfTypeEnum.qingYiSe;
}
假设我们写了一些牌型判断方法(注意:只是参考代码,不为实现需求),如果是使用if判断,那么最终的代码可能是这样:
/*
if(hunYaoJiu(tiles)!=null) {
return hunYaoJiu(tiles);
}
if(qingYiSe(tiles)!=null) {
return qingYaoJiu(tiles);
}
.......
*/
或许需要判断近百次?这种代码不要说项目经理,就是我们自己应该也是看不下去的。那么就可以用上枚举来进行解决了。
我们先创建一个枚举:
public enum verdictWinTilesTypeEnum {
}
我们在枚举中定义属性值:
qingYaoJiu{
public MahJongWinOfTypeEnum getTilesType(List<Tiles>tiles){
return TilesTypeJudgment.qingYaoJiu(tiles);
};
},
qingYiSe{
public MahJongWinOfTypeEnum getTilesType(List<Tiles>tiles){
return TilesTypeJudgment.qingYiSe(tiles);
};
};
public MahJongWinOfTypeEnum getTilesType(List<Tiles>tiles) {
return null;
}
定义枚举属性大家应该不陌生,我们在属性内部定义一个public的getTilesTye方法,每个属性内部的方法分别调用对应的处理方法。
下面就是枚举内部的遍历处理:
/**
* 判断赢牌的最终牌型
* @param tiles
* @return
*/
public static MahJongWinOfTypeEnum verdictWinTilesType(List<Tiles>tiles) {
for (verdictWinTilesTypeEnum e : verdictWinTilesTypeEnum.values()) {
if(e.getTilesType(tiles)!=null) {
return e.getTilesType(tiles);
}
}
return null;
}
那么最终展示在接口的调用方法,其实只需要:
if(verdictWinTilesTypeEnum.verdictWinTilesType(tiles)!=null) {
/*for (Tiles t : tiles) {
System.err.println(t.getTilesId());
}*/
}
这样就完美解决了使用过多的if判断处理。