Java中if-else过多怎么解决

发布时间:2020-11-11 14:35:36

来源:亿速云

阅读:98

作者:Leah

Java中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 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 invokable =

(Invokable) Invokable.from(method);

invokable.invoke(new ReflectTest());

}

3. lambda表达式

实现同上面的反射,结合了Java 8的新特性:lambda表达式

@Test

public void testJava8() {

Map> 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();

}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

java if else 过多_Java中if-else过多怎么解决相关推荐

  1. java可以多重继承吗_Java中的多重继承与组合vs继承

    java可以多重继承吗 有时我写了几篇有关Java继承,接口和组成的文章. 在这篇文章中,我们将研究多重继承,然后了解组成优于继承的好处. Java中的多重继承 多重继承是创建具有多个超类的单个类的能 ...

  2. java中有没有栈_Java中堆和栈有什么区别

    stack 和 heep 都是内存的一部分stack 空间小,速度比较快, 用来放对象的引用heep 大,一般所有创建的对象都放在这里.栈(stack):是一个先进后出的数据结构,通常用于保存方法(函 ...

  3. java 基本类型 引用_java中 引用类型 和 基本类型 有何区别?

    栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newa ...

  4. java构造器详解_Java中关于构造器的使用详解

    这篇文章主要介绍了Java构造器使用方法及注意事项的相关资料,这里举例说明如何使用构造器及需要注意的地方,需要的朋友可以参考下 Java构造器使用方法及注意事项 超类的构造器在子类的构造器运行之前运行 ...

  5. java用scanner类_java中关于scanner类的详细介绍

    1.Scanner的实现步骤 第一步:在有效代码的第一行,通过import导入Scanner类!import java.util.Scanner; 第二步:通过new关键字实例化一个Scanner对象 ...

  6. java读取文件 路径_Java中的获取文件的物理绝对路径,和读取文件

    获取文件的绝对路径,读取该文件 一.文件目录打印图 下面的文件目录图,是项目中文件的位置信息:下面的例子是按照这个图来演示的. . |-- java | |-- ibard | | |-- demo1 ...

  7. java多线程 线程安全_Java中的线程安全

    java多线程 线程安全 Thread Safety in Java is a very important topic. Java provides multi-threaded environme ...

  8. java 异常处理发生异常_Java中的异常处理

    java 异常处理发生异常 Exception Handling in Java is a very interesting topic. Exception is an error event th ...

  9. java string 对象地址_Java中String对象的存储位置(学习笔记)

    packagetest.string.equal;public classMain {/*** 创建了三个对象,"helloworld对象创建在常量池中",每次new String ...

  10. java 定义整数数组_JAVA中数组的正确定义方法是什么?

    数组是有序数据的集合,数组中的每个元素具有相同的数组名和下标来唯一地确定数组中的元素. §5.1一维数组 一.一维数组的定义 type arrayName[]; 其中类型(type)可以为Java中任 ...

最新文章

  1. C#帮助类:MD5加密
  2. oracle数据库查表_oracle数据库常用的99条查询语句
  3. python popen函数讲解_Python常用模块函数代码汇总解析
  4. Java volatile关键字原理解剖
  5. python gui编程框架_工程师必知的几个Python GUI框架
  6. RAC环境在ASM上创建表空间出错ORA-569
  7. 二分查找法---java实现
  8. Codeforces Round #493 (Div. 2) C. Convert to Ones 乱搞_构造_好题
  9. Linux kernel 4.x中的min和max宏
  10. Photoshop CS5的序列号
  11. python中match用法_python re.match()用法相关示例
  12. 最小化安装CentOS-7-x86_64-Minimal-1511图文教程
  13. python手机连点器代码_【触动精灵】手机万能连点器 Lua 源码
  14. mac用什么软件测试硬盘好坏,Mac怎么测试硬盘速度?
  15. 对联广告代码效果大全
  16. 大数据课程——Spark SQL
  17. 2023年全国最新会计专业技术资格精选真题及答案18
  18. GBF ASIA亚太电池展
  19. 日期时间存入数据库会差一天?
  20. Ae效果控件快速参考:模糊和锐化

热门文章

  1. Maven发布封装到中央仓库时候报错:no default secret key: No secret key
  2. oracle显性游标,Oracle高级显式游标的使用
  3. numpy条件筛选的坑
  4. 自定义dropout
  5. RoIPooling
  6. python Sigmoid和Tanh 可视化
  7. VC++ inline内联函数的作用解决方案
  8. python调用cmd命令
  9. opengl入门资料
  10. jsp中session 失效设置