Java中避免过多if-else的几种方法
作者:tom3mao 发布时间:2023-11-28 13:07:09
标签:Java,if-else
太多的if-else不太直观,难以维护。
以下面代码为例,展示几种替代if else的方法。
String input = "three";
@Test
public void testElse() {
if ("one".equals(input)) {
System.out.println("one");
} else if ("two".equals(input)) {
System.out.println("two");
} else if ("three".equals(input)) {
System.out.println("three");
} else if ("four".equals(input)) {
System.out.println("four");
}
}
需要引入Spring跟Guava依赖
1.Spring结合策略模式
Spring可以将一组实现了同样接口的类注入一个List
/***
* 定义接口。type用来路由具体的Handler实现
* */
public interface Handler {
String getType();
void execute();
}
/**
* 将Handler接口的实现类注入一个List
* */
@Autowired
private List<Handler> handlerList;
@Test
public void testAutowireList(){
// 根据类型判断该由哪个具体实现类处理
for(Handler handler:handlerList){
if(input.equals(handler.getType())){
handler.execute();
}
}
}
下面是几种轻量级实现.
2. 反射
通过反射动态调用相应的方法
/***
*定义每种类型所对应的方法
*/
public class ReflectTest {
public void methodOne() {
System.out.println("one");
}
public void methodTwo() {
System.out.println("two");
}
public void methodThree() {
System.out.println("three");
}
public void methodFour() {
System.out.println("four");
}
}
/***
*
* 通过反射,动态调用方法。采用了Guava的工具类。
* */
@Test
public void testReflect() throws Exception {
//首字母大写,根据类型拼接方法
String methodName = "method" + LOWER_CAMEL.to(UPPER_CAMEL, input);
Method method = ReflectTest.class.getDeclaredMethod(methodName);
Invokable<ReflectTest, Object> invokable =
(Invokable<ReflectTest, Object>) Invokable.from(method);
invokable.invoke(new ReflectTest());
}
3. lambda表达式
实现同上面的反射,结合了Java 8的新特性:lambda表达式
@Test
public void testJava8() {
Map<String, Consumer<ReflectTest>> functionMap = Maps.newHashMap();
functionMap.put("one", ReflectTest::methodOne);
functionMap.put("two", ReflectTest::methodTwo);
functionMap.put("three", ReflectTest::methodThree);
functionMap.put("four", ReflectTest::methodThree);
functionMap.get(input).accept(new ReflectTest());
}
4. 枚举
在枚举里面定义一个抽象方法,每种类型对应各自的具体实现。
/**
* 定义枚举类,包含了所有类型
*/
public enum EnumTest {
ONE("one") {
@Override
public void apply() {
System.out.println("one");
}
},
TWO("two") {
@Override
public void apply() {
System.out.println("two");
}
}, THREE("three") {
@Override
public void apply() {
System.out.println("three");
}
}, FOUR("four") {
@Override
public void apply() {
System.out.println("four");
}
};
public abstract void apply();
private String type;
EnumTest(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
// 枚举测试
@Test
public void testEnum() {
EnumTest.valueOf(input.toUpperCase()).apply();
}
来源:https://blog.csdn.net/j16421881/article/details/79967948


猜你喜欢
- 最近项目中使用了mybatis-plus 3.1.1版本,发现使用lambda表达式方式的条件构造器,执行时会报错;但是我用单元测试却通过,
- 这些天忙着刷题,又怕遗忘了spring boot, 所以抽出一点时间折腾折腾,加深点印象。 spring boot 的文件上传与 sprin
- 本文实例讲述了Android编程实现小说阅读器滑动效果的方法。分享给大家供大家参考,具体如下:看过小说都知道小说阅读器翻页有好多种效果,比如
- 虽然现在硬盘越来越大,但是清理垃圾还是必要的。这时我们往往需要一个获取文件夹所占空间大小的功能,从而判断垃圾文件的位置。这个时候,我们常用的
- 二进制、八进制和十六进制向十进制转换都是非常容易的,就是“按权相加”。所谓“权”,也即“位权”。例如,十进制第1位的位权为100=1,第2位
- @PathVariable接收两个参数首先@PathVariable无法接收对象,但是可以接收多个值var data = obj.data;
- 以下代码为一个工具类package com.imooc.reflect;import java.lang.reflect.Method;pu
- 首先,这两者是完全不同的概念,绝对不能混为一谈。1.什么是Java内存模型?Java内存模型是Java语言在多线程并 * 况下对于共享变量读写
- 前两天忙着写开题报告,没有来得及做项目,今天继续研究一下这个项目。上次研究到后端的DAO层,研究了一下后端和数据库交互的过程,service
- 强制下线是需要关闭所有的活动,先创建一个类来管理所有的活动。class ActivityCollector { //var ac
- 读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时
- C# 中有三种定时器,System.Windows.Forms 中的定时器和 System.Timers.Timer 的工作方式是完全一样的
- 1.为什么要用thrift js C#? 1.1 首先,js 通过 thrift 访问C#,实际上是一种
- 效果图:后来又出了两篇,也可以看一下Android选择与上传图片之PictureSelector教程Android选择与上传图片之Matis
- 嵌入式开发中,由于产品的绑定、验证等逻辑限制比较严重,需要自己做一个上位机工具,来实现USB/BT通讯工具,实现如串口通讯、OTA升级等功能
- Jackson库中objectMapper用法ObjectMapper类是Jackson库的主要类。它提供一些功能将转换成Java对象与SO
- 1 起因在实际业务开发中, 我们经常会遇到需要临时创建一个数组的情况, 今天我们就来讲一下Java中ArrayList初始化的方法2 解决方
- 什么是程序集?1.程序集(assembly)是一个及一个以上托管模块,以及一些资源文件的逻辑组合。2.程序集是组件复用,以及实施安全策略和版
- 目前的App在安装后,第一次打开,都会显示两秒左右的logo,然后进入引导页。如果关闭App,再重新打开,则只会显示logo,然后直接进入主
- 概述归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有