使用枚举优雅解决过多方法验证的问题,避免使用过多的if

在开发过程中,难免碰到很多需要判断的属性,比如大家经常玩的麻将,就可能需要对胡牌类型进行判断,例如“大三元”、“大四喜”、“十三幺”等牌型。
正常情况下,我们可能会根据每种牌型都写一个判断方法,那么就出现了一个很严重的问题:国际麻将中近百种牌型,我们是否需要判断近百次?也许可以进行一些特殊判断再进入具体判断:例如判断是否都是顺子?那么可以排除一些例如“清幺九”、“清碰”等牌型。但是具体实现起来也是一个不得了的判断过程,所以我们可以使用枚举来进行做方法判断,最终提供给接口那边的应该只有一个判断。

直接上代码:

/**
	 * 特殊牌型判断之混幺九
	 * @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判断处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值