`这是我参与更文应战的第16天,活动概况查看: 更文应战
立个Flag每天写点东西,坚持下去。
项目中怎么高雅的消除if-else
消除if-else的方法有很多种,本文结合spring中ArgumentResolver的使用,供给一种高雅地方法。
先看ArgumentResolv接口是什么er的使用方法
public class UserArgumentResolver implementsredis数据结构 HandlerMethodArJSONgumentResolver {
privat接口英文e static final String TOKENjson_KEY = "token";
@Override
public boolean supportsParameter(MethoJSONdParameter parameter) {
return parameter.hasParamJSONeredis分布式锁terAnnotation(LoginUser.class);
}
@Override
public Objectspringboot常用注解 reJSONsolveArgumenElementt(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest welements翻译ebRequest,
WebDataBinderFactory binderFact接口的效果ory) throws Exception {
// 经过session取userid
String token = webRequest.getHeader(TOKEN_KEY);
User user = null;
// 从redis中获取user json
// user = JSONjson是什么意思.parelementuise(redis.get(token),User.class);
return user;
}
}
controller 需求注入参数的当地
@RequestMapping(value = "/doSth", method = RequestMethod.POST)
public String feed(@LoginUser User user) {
System.out.prinjson数据tln("userId: " + JSON.toJsonString(user));
return "success";
}elements翻译
声明注解LoginUser
@Target(E接口和抽象类的差异lementType.TYPE,ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RestContspring面试题roller {
String value() default "";spring
}
装备类增加
@Configuration
public class WebConfiguration implements WebMvcCrediscoveronfigurer {
@Override
public void addArgumentResolvers (List<HandlerMethodArgumentResolver> resolvers) {
resolveSpringrs.add(new UserArgumentResolverspringcloud五大组件());
}
}
有多个ArgumentResol接口crc错误计数ver在WebConfiguration中装备即可。
if-else消除
常用代码 如交通方法有 bikrediscoveringe, bus,subway,trjsonain,plan
if (bike) {
} else if (bus) {
} else if (subway) {
} else if (train) {
} else if (plan) {
}else {
}
编写不同的reslover
定义一致的接口
public interface TrafficResolver {
boolean support(String type);
Object resolver(Object argume接口卡nt接口英文);
}
定义完毕类BusTrafficResolver,其他省掉
@Compoment
public class BusTrafficResolver imspringboot常用注解plements TrafficResolver{
@Overridespring是什么意思
public boolean support (String type) {
return "BUS".eqelementanimationuals(type);
}
@Override
public Object resolver (Object argument) {
// doSth
return "bus resolver";
}
}
真正消除if-else的服务类
List 若没有bean则需求requireRedisd 比供给默认值new ArrayLredis分布式锁ist<>() ,有bean 能够去掉。
@Service
public class TrafficService {
// required = false
@Autowredis的五种数据类型ired(required = false)
List<TrafficResolver> trafficResolverList = new ArrayList<>redis数据结构;();
public Object traffic(String type,Object argument){
Syst接口文档em.ouElementt.printf("trafficResolverList "+trafficResolverList.size());
TrafficResolver reredis的五种数据类型solver = getFirstResolver(type);
if(resolver!=null){
return resolver.resolver(argument);
}
return "traffic not find. type: "+type;
}
private Traffielementary是什么意思cResolver getFirstResolver(String type){
Trafjsonp跨域原理ficResolver resolver = trafficResolverList.stream()
.filter(item -> item.support(type))
.findFirst()
.orElse(null);
relementuieturn resolver;
}
}
经过此种方法完毕了对if-else调用类的解耦,完毕了高扩展性。遵照了面向修正关闭,面向扩展翻开的准则。
消除if-else完毕,当然能够用注解的方法,经过注解类型判断是否支持。
其实if接口的效果-elsredis是什么e挺好用,除非考elementui虑扩展性很强的当地,否则不要过度规划。