java中关于switch case语句,多个case匹配相同的情况一些个人见解

java中关于switch case语句,多个case匹配相同的情况一些个人见解

		最近遇到了这样的一个需求。有这样的一个需求, 当类型传入1,2,3,5,7,9,10,11,12,13,14的时候需要把传入的num进行累加,如果类型传入4,6的时候需要把传入的num进行替换保留最大值,如果传入8的时候需要和目标值匹配,如果等于目标值则保存。
		开始的时候我使用if。。。。else的方式实现,发现算法的时间复杂度不稳定。		 
		  if(type==1
			//弹球大咖
			||type==2
			//弹球大神
			||type==3
			......){
		userAchievement.setFinishNum(userAchievement.getFinishNum()+finishNum);
	}else.....
	}
	当type==1的时候判断只会执行一次,但是如果越靠后的值,执行判断的次数就会越多。这时候需要考虑使用switch...case+枚举进行优化。
	先在枚举类型中加入getAchievementTypeByType的方法:
	public static enum AchievementType {
	INVITE_FRIENDS(1),//高朋满座
	BALL_SUPERIOR(2),//弹球大咖
	BALL_GOD(3),//弹球大神
	MAX_SCORE(4),//经典模式中达到#分
	FEARLESS(5),//浑身是胆
	PASS_EXPERT(6),//通关达人
	LOYAL_FANS(7),//忠实粉丝
	PRECISE_CONTROL (8),//精准控分
	VIEW_MARS(9),//皮肤战神
	LUCK_BOX(10),//手气爆棚
	CONTINUOUS_DOWN(11),//单次连续下落#层
	DESTROY_KING(12),//破坏之王 累积击碎XX层
	COUNT_VIDEO(13),//观看视频#次
	GET_MONEY(14),//大富豪
	ADD_TYPE(999);//累加类型(只为代码中返回)
    // 定义私有变量
    public int type ;
    // 构造函数,枚举类型只能为私有
    private AchievementType( int type) {
        this . type = type;
    }
    public static AchievementType getAchievementTypeByType(int type){
    	switch (type) {
		case 1:
			return INVITE_FRIENDS;
		case 2:
			return BALL_SUPERIOR;

。。。。。。
}
}

	GameStaticData.AchievementType aType = GameStaticData.AchievementType.getAchievementTypeByType(type);
	switch (aType) {
	case INVITE_FRIENDS:
	case BALL_SUPERIOR:
		。。。。。。
		break;
	default:
		。。。。。。
		}
		break;
	}
	这样的确是实现了这个需求,但是发现执行效率和之前的if差不多。
	现在我们就说下个人对switch case的执行过程中的一些理解:
	首先switch case在编译的时候会把case分成很多个内存,每个内存地址都是用的case中的值hash过后的,switch (aType) 中首先对传入的type进行hash,然后在jvm中调用对应的case的值中的代码块进行执行,如果没有,则执行default。如果有,则执行代码块,但是
在C语言,`switch` 语句用于根据某个表达式的值执行不同的代码块。当你遇到多个`case` 块具有相同条件时,可以使用`default` 或者共享代码块的方式处理这种情况。 1. **使用`break`**:通常情况下,每个`case` 后面都跟着`break`语句,用来退出当前的`switch` 语句。如果你发现多个`case` 的条件匹配,但它们后面的代码是相同的,可以在最后一个匹配的`case` 后不加`break`。程序会按顺序执行到下一个`break`为止。这样做的前提是后续的`case` 没有被匹配。 ```c switch (expression) { case value1: // 共享代码 // ... break; // 如果这是最后一个匹配的,可以省略break case value2: // 共享代码 break; // 更多case... default: // 其他情况 break; } ``` 2. **使用`fallthrough`(C99以后)**:在C99及以上版本,引入了`fallthrough`关键字,允许程序从一个`case` 直接跳转到下一个`case`,即使没有`break`。这可以避免重复代码,但要注意控制好代码流程,因为这不是标准行为,可能会导致意外的结果。 ```c switch (expression) { case value1: // 共享代码 fallthrough; // 使用fallthrough关键字 case value2: // 共享代码 break; // 更多case... default: // 其他情况 break; } ``` 3. **共享代码块**:另一种方法是在`switch` 之外定义一个代码块,然后在所有匹配的`case` 下调用这个代码块。这需要对代码进行一些重构,确保每个`case` 的逻辑可以正确地调用这个共享部分。 ```c void shared_code() { // 共享代码 } switch (expression) { case value1: case value2: shared_code(); // 其他case...的代码 break; // 更多case... default: shared_code(); // 其他情况 break; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值