Java中如何优雅的消除Swtich Case

本文探讨了在Java中如何优雅地消除Switch Case结构,通过Map存储不同case的处理器,并利用Enum特性,避免大量子类的实现。这种方法能完全去除Switch case,保持代码简洁,且不影响原有类结构。

Java中如何优雅的消除Swtich Case

背景

现实生活中,多少童鞋写过下面这种代码:

void ReceiveMessage(Message message) {
	switch(message.type) {
		case TYPE1:
			// handle type1
		break;
		case TYPE2;
			// handle type2
		break;
		// other type
		default:
	}
}

有5种消息还好,试想各位如果有100种消息,应该是头皮发麻的。想要解决这个问题的同学,除开这文章提到的Spring方式以外,查一查应该可以找到下面这种重构基本类似的写法:

void ReceiveMessage(Message message) {
	switch(message.type) {
		case TYPE1:
			new TypeOneHandler().handle();
		break;
		case TYPE2;
			new TypeTwoHandler().handle();
		break;
		// other type
		default:
	}
}

abstract Class Handler {
	void handle();
}

Class TypeOneHandler implement Handler {
	@override
	void handle() {
		// handle type 1
	}
}

这种写法还是没能根本性去掉switche case对吧。

到底咋写别墨迹

大佬们别着急,这就show the code。
受到这篇文章的启发,给出了一种更优雅一些的实现方式。

思路

  • 通过Map将不同case的handler存起来,要使用的时候从map中拿
  • 通过Enum自带的语法糖特性,避免实现过多子类
Class A {
	static Map<MessageType, MyHandler> handlerMap = new HashMap();

	static {
		handlerMap.put(TYPE1, MY_TYPE1);
		handlerMap.put(TYPE2, MY_TYPE2);
		// put other type here
	}

	void ReceiveMessage(MessageType type, Message message) {
		handlerMap.get(type).handle(this, message)
	}

	handleType1(Message message) {;}
	handleType2(Message message) {;}

	interface MyHandler {
		void handle(A aObject, Message message);
	}

	private Enum MyEnumHandler implements MyHandler{
		MY_TYPE1 {
			@Override
			handle(A aObject, Message message) {
				a.handleType1(message);
			}
		},
		MY_TYPE2 {
			@Override
			handle(A aObject, Message message) {
				a.handleType2(message);
			}
		},
		// other type
	}	
}

优势

  • 完全消除Switch case
  • 完全内嵌在原有的Class中,不会对外界有影响
  • 避免实现过多子类,写法更加简洁

第一次写博客,不足的地方欢迎各位来捶,可劲儿的那种 ^-^

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值