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

到此这篇关于Java中避免过多if-else的几种方法的文章就介绍到这了,更多相关Java 过多if-else内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java编程细节重构之为什么if-else不是好代码详析

    前言 面向过程设计和面向对象设计的主要区别是:是否在业务逻辑层使用冗长的if else判断.如果你还在大量使用if else,当然,界面表现层除外,即使你使用Java/C#这样完全面向对象的语言,也只能说明你的思维停留在传统的面向过程语言上.本文将通过示例代码给大家介绍关于Java编程细节重构之if-else的相关内容,下面来一起看看详细的介绍吧 平时开发中if-else用的多吗? 其实这是个再正常不过的coding习惯,当我们代码量小的时候用来做条件判断是再简单不过的了. 但对于优秀程序员来说

  • 详解在java中进行日期时间比较的4种方法

    1. Date.compareTo() java.util.Date提供了在Java中比较两个日期的经典方法compareTo(). 如果两个日期相等,则返回值为0. 如果Date在date参数之后,则返回值大于0. 如果Date在date参数之前,则返回值小于0. @Test void testDateCompare() throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

  • 详解JAVA中获取文件MD5值的四种方法

    JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过MessageDigest类进行MD5加密,第三步转换成16进制的MD5码值.几种方法的不同点主要在第一步和第三步上.具体可以看下面的例子: 方法一. private final static String[] strHex = { "0", "1", "2"

  • Java中如何获取mysql连接的3种方法总结

    前言 本文主要来说说三种 Java 中获取 mysql 连接的方式,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 第一种:传统的连接方式: 第二种:读取配置文件方式: 第三种:数据库连接池. 一.传统的连接方式: 首先在 src 目录下创建名为 lib 的文件夹,导入数据库驱动的 jar 包,随后 "add to build path". 1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); 2.获取连接 S

  • Java中保留两位小数的四种方法实现实例

    在写程序的时候,有时候可能需要设置小数的位数,那么java中有哪几种保留小数位数的方法呢?本文以两位小数为例给出四种方法. package CodeJava_Leet; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; /** * Created by Yechengpeng on 2016-08-14. */ public class Test { public

  • java中Map和List初始化的N种方法总结

    目录 Map和List初始化方法 第一种方法(常用方法) 第二种方法(双括号初始化法) 第三种,stream初始化 初始化Map和List小技巧(指定容量+匿名内部类初始化) 总结 Map和List初始化方法 第一种方法(常用方法) //初始化List   List<string> list = new ArrayList<string><string>();   list.add("string1");   list.add("strin

  • java中实体类转Json的2种方法

    首先申明所需jar包: ezmorph-1.0.6.jar jackson-all-1.7.6.jar jsoup-1.5.2.jar 一.创建一个实体类Emp. package com.hyx.entity; public class Emp { private Integer id; private String name; private Integer dptNo; private String gender; private String duty; public Integer ge

  • 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("

  • Java中SSM+Shiro系统登录验证码的实现方法

     先给大家展示下效果图: 1.验证码生成类: import java.util.Random; import java.awt.image.BufferedImage; import java.awt.Graphics; import java.awt.Font; import java.awt.Color; /** * 验证码生成器类,可生成数字.大写.小写字母及三者混合类型的验证码. 支持自定义验证码字符数量: 支持自定义验证码图片的大小: 支持自定义需排除的特殊字符: * 支持自定义干扰线

  • Java 中责任链模式实现的三种方式

    责任链模式 责任链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止.这里就不再过多的介绍什么是责任链模式,主要来说说java中如何编写.主要从下面3个框架中的代码中介绍. servlet中的filter dubbo中的filter mybatis中的plugin 这3个框架在实现责任链方式不尽相同. servlet中的Filter servlet中分别定义了一个 Filter和Filter

  • java中同类对象之间的compareTo()和compare()方法对比分析

    首先我们都知道java中的比较都是同一类对象与对象之间的比较,就好像现实生活中比较人和人的年龄一样,你不会去把人的年龄和人的身高来比较,这显然是没有意义的. java中同类对象之间的比较又分为两种,基本类型之间的比较和引用类型之间的比较. java中"=="比较对象是否引用了同一个对象,或者比较基本类型变量值是否相等.Object类的equals()方法用来比较是否一个对象(内存地址比较),可以重写. JDK中有些类重写了equals()方法,只要类型.内容都相同,就认为相等.很变态的

随机推荐