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中,不会对外界有影响
- 避免实现过多子类,写法更加简洁
第一次写博客,不足的地方欢迎各位来捶,可劲儿的那种 ^-^
本文探讨了在Java中如何优雅地消除Switch Case结构,通过Map存储不同case的处理器,并利用Enum特性,避免大量子类的实现。这种方法能完全去除Switch case,保持代码简洁,且不影响原有类结构。
4880





