如何 Java 中的大量的 if else 判断?

news2024/11/25 12:53:42

目录

问题出现:

如何 Java 中的大量的 if else 判断?

解决方案:

   1.策略模式

    2.工厂模式

    3.映射表

   4.反射+配置文件------极力推荐使用!!!!!


问题出现:

如何 Java 中的大量的 if else 判断?

在编写Java相关程序时,我们经常遇到:

 大量的 if  else 语句,无不让人内心疯狂,这都是些啥代码啊!!!!!!一点编程艺术的没有,简称:烂代码!

如果学习过设计模式,那应该没问题了。

解决方案:

在 Java 中,有多种方式可以避免大量的 if-else 判断。下面列举一些常用的方法和相关案例:

 

   1.策略模式

        策略模式是一种行为型设计模式,它通过定义一系列算法类(策略类),将算法的实现与使用分离开来,使得算法可以独立于使用它的客户端而变化。在 Java 中,策略模式通常被应用于业务逻辑中,用于处理不同的业务场景和业务规则。具体实现如下:

        首先,定义一个策略接口或抽象类,用于封装具体的算法:

public interface Strategy {
    void execute();
}

       然后,定义多个具体的策略类,实现该接口或抽象类:

public class ConcreteStrategyA implements Strategy {
    @Override
    public void execute() {
        // 实现具体的算法 A
    }
}

public class ConcreteStrategyB implements Strategy {
    @Override
    public void execute() {
        // 实现具体的算法 B
    }
}

public class ConcreteStrategyC implements Strategy {
    @Override
    public void execute() {
        // 实现具体的算法 C
    }
}

        接着,定义一个上下文类,用于管理所有的策略:

public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public void executeStrategy() {
        strategy.execute();
    }
}

         最后,在客户端中,根据业务需要,传入相应的策略对象,执行对应的算法:

Strategy strategy = new ConcreteStrategyA(); // or new ConcreteStrategyB() 或者new ConcreteStrategyC()
Context context = new Context(strategy);
context.executeStrategy();

 

    2.工厂模式

       工厂模式是一种创建型设计模式,它通过定义一个工厂类来封装对象的创建过程,从而将客户端代码与具体的产品实现解耦。在 Java 中,工厂模式通常被应用于对象的创建和组装场景中。具体实现如下:

      首先,定义一个产品接口或抽象类,用于封装产品的通用接口或抽象父类:

public interface Product {
    void method();
}

        然后,定义多个具体的产品类,实现该接口或抽象父类:

public class ConcreteProductA implements Product {
    @Override
    public void method() {
        // 实现具体的产品 A 的方法
    }
}

public class ConcreteProductB implements Product {
    @Override
    public void method() {
        // 实现具体的产品 B 的方法
    }
}

public class ConcreteProductC implements Product {
    @Override
    public void method() {
        // 实现具体的产品 C 的方法
    }
}

        接着,定义一个工厂类,用于创建产品对象:

public class Factory {
    public static Product create(String type) {
        switch (type) {
            case "A":
                return new ConcreteProductA();
            case "B":
                return new ConcreteProductB();
            case "C":
                return new ConcreteProductC();
            default:
                throw new IllegalArgumentException("Invalid type: " + type);
        }
    }
}

        最后,在客户端中,调用工厂类的静态方法,创建对应的产品对象:

Product product = Factory.create("A"); // or Factory.create("B") 或者Factory.create("C")
product.method();

 

    3.映射表

        映射表是一种基于哈希表实现的数据结构,它可以将多个条件值(如字符串或枚举值)映射到对应的处理函数上。在 Java 中,通过使用 Map 数据结构,可以很方便地实现映射表。具体实现如下:

        首先,创建一个 Map 对象,用于存储条件值和处理函数之间的映射关系:

Map<String, Runnable> map = new HashMap<>();

        然后,将每个条件值和对应的处理函数注册到 Map 中:

map.put("value1", () -> {
    // 处理 value1 条件的逻辑
});

map.put("value2", () -> {
    // 处理 value2 条件的逻辑
});

// ...

        最后,在客户端中,根据需要执行对应的处理函数:

String condition = "value1"; // or "value2" 或者其他条件值
Runnable handler = map.get(condition);
if (handler != null) {
    handler.run();
} else {
    throw new IllegalArgumentException("Unsupported condition: " + condition);
}

   4.反射+配置文件------极力推荐使用!!!!!

可以看看这个:http://t.csdn.cn/XJIpu 

不知道反射?看这:-----》》》http://t.csdn.cn/5sbcp

  • 在 Java 中,if-else 语句通常用来处理不同的条件分支。虽然 if-else 语句很好用,但如果有大量的 if-else 分支,会降低程序的可读性、可维护性和可扩展性。当需要添加或删除某个条件分支时,需要修改相应的代码,这样容易引入新的错误或导致不必要的耦合。为了避免这些问题,可以使用反射和配置文件来解决大量的 if-else 判断。
  • 反射是一种在运行时获取类信息和类实例,并通过这些信息和实例来调用类的方法或操作其属性的机制。Java 提供了一组反射 API,可以在运行时获取类的结构信息、创建类的实例、访问类的属性、调用类的方法等。使用反射机制可以将程序的控制流程动态化,不再依赖于编译时确定的类型和方法,从而提高了程序的灵活性和可扩展性。
  • 配置文件是一种文本文件,用于保存程序的配置信息。Java 中的配置文件通常以 .properties 或 .xml 格式保存,其中 .properties 文件格式最简单,它由多个属性名和属性值组成,每个属性名和属性值之间使用等号(=)连接。使用配置文件可以将程序的配置信息从代码中分离出来,使得程序的配置更加灵活和易于管理。

使用反射和配置文件来避免大量的 if-else 判断的实现步骤如下:

 

--1.定义一个接口或抽象类,用于定义通用行为或方法。例如,定义一个接口 Action,用于执行某个动作:

public interface Action {
    void execute(String param1, String param2);
}

--2.定义多个实现该接口或抽象类的具体类,实现自己的业务逻辑。例如,定义两个实现类 ConcreteAction1 和 ConcreteAction2。

public class ConcreteAction1 implements Action {
    @Override
    public void execute(String param1, String param2) {
        // 处理 ConcreteAction1 业务逻辑
    }
}

public class ConcreteAction2 implements Action {
    @Override
    public void execute(String param1, String param2) {
        // 处理 ConcreteAction2 业务逻辑
    }
}

--3.将每个具体类的信息(包括类名、参数等)保存到配置文件中。例如,将上述两个类的信息保存到 config.properties 文件中。

action.1=com.example.ConcreteAction1
action.2=com.example.ConcreteAction2

--4.在程序启动时,读取配置文件,并通过反射机制创建具体类的实例。例如,读取 config.properties 文件中的属性,并创建 ConcreteAction1 的实例。

Properties props = new Properties();
try (InputStream stream = getClass().getResourceAsStream("config.properties")) {
    props.load(stream);
}

String actionName = props.getProperty("action.1"); // 具体类的类名
Class<?> actionClass = Class.forName(actionName);
Action action = (Action) actionClass.getDeclaredConstructor().newInstance(); // 创建具体类的实例

--5.在程序运行时,通过 Action 接口调用具体类的方法。例如,执行 ConcreteAction1 的 execute 方法,并传入参数。

action.execute("param1", "param2");

        使用反射和配置文件来避免大量的 if-else 判断可以将程序的控制流程动态化,从而提高了程序的灵活性和可扩展性。当需要添加或删除某个条件分支时,只需要修改配置文件,而不需要修改代码。使用这种方式还可以将程序的配置信息和业务逻辑分离开来,使得程序更加易于管理和维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/649963.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32F407ZGT6 LQFP144 uart 打印输出

STM32F407ZGT6 AX58100 ETHERCAT芯片软件&#xff0c;需要查看SSC 协议栈运行情况&#xff0c;UART输出状态信息。 STM32F407ZGT6 驱动库使用标准库&#xff0c;虽然老&#xff0c;但是够用。 1.STM32F407ZGT6 芯片情况 STM32F407ZGT6 作为AX58100 的主控 2.板子硬件 STM3…

mysql双主不一致数据修复

参考&#xff1a; pt-table-checksum — Percona Toolkit Documentation pt-table-sync — Percona Toolkit Documentation #对比host1 test库与备库差别 pt-table-checksum hhost1,proot,P3306,uroot -d test --recursion-method processlist --no-check-binlog-format -…

Spring Boot进阶(52):Spring Boot 如何集成Flyway并初始化执行 SQL 脚本?| 超级详细,建议收藏

1. 前言&#x1f525; 在我们的认知中&#xff0c;我们会使用 SVN 或 Git 进行代码的版本管理。但是&#xff0c;我们是否好奇过&#xff0c;数据库也是需要进行版本管理的呢&#xff1f; 在每次发版的时候&#xff0c;我们可能都会对数据库的表结构进行新增和变更&#xff0c;…

微机保护的数据采集系统(1)

一、模拟五输入电路概述 模拟量输入电路是微机保护装置中很重要的电路。保护装置的动作速度和测量精确度等性能都与该电路密切相关。模拟量输入电路的主要作用是隔离、规范输入电压及完成模数变换&#xff0c;以便与CPU接口&#xff0c;完成数据采集任务。因此这部分电路又称数…

iOS —— xcode14兼容 iOS9~iOS10系统

xcode14兼容 iOS9&#xff5e;iOS10系统 在Xcode升级到Xcode14以后&#xff0c;系统的支持版本升级到了iOS11.0。但是我们项目需要支持iOS9&#xff0c;脚本打包错误提示&#xff1a; The iOS deployment target IPHONEOS_DEPLOYMENT_TARGET is set to 9.0, but the range of …

鼠标的移入、移出事件

目录 一、mouseover和mouseenter 二、mouseout和mouseleave 三、重点总结 在原生JS中鼠标移入移出事件有四个&#xff0c;分别为mouseover ,mouseout ,mouseenter,mouseleave&#xff0c;其中mouseover和mouseenter为移入事件&#xff0c;mouseout和mouseleave为移出事件&…

IDEA提交过滤target、idea、iml、vscode、build、iws、imlz、ipr、xls、rebel.xml

一、问题截图&#xff08;IDEA提交过滤target、idea、iml、vscode、build、iws、imlz、ipr、xls、rebel.xml&#xff09; 二、解决 添加.gitignore提交到仓库&#xff0c;就可以了 HELP.md target/ !.mvn/wrapper/maven-wrapper.jar !**/src/main/** #!**/src/test/**### STS …

交换机中光口是如何配置的

在往期的文章中我们有介绍到电口和光口的概念&#xff0c;以及两者之间的区别。本期文章我们来了解一下交换机光口的是如何配置的。 一、交换机光口是如何配置的 1、确认光口类型&#xff1a;首先&#xff0c;确定光口插槽使用的光模块类型&#xff08;如SFP、SFP、QSFP等&am…

掌握5个关键点,搞定语音识别测试!

现在市面上的智能电子产品千千万&#xff0c;为了达到人们使用更加方便的目的&#xff0c;很多智能产品都开发了语音识别功能&#xff0c;用来语音唤醒进行交互&#xff1b; 另外&#xff0c;各大公司也开发出来了各种智能语音机器人&#xff0c;比如小米公司的“小爱”&#…

Redis实战案例2-基于Redis实现共享session短信登录

1. 实现Redis替代session的业务流程 保存用户登录信息采用Hash结构&#xff1b; key要保证唯一&#xff0c;用随机生成的token&#xff08;随机字符串&#xff09;作为key&#xff1b; 并且要保证客户端可以携带key去redis取出value&#xff0c;之前采用session方式是Tomcat自动…

实在智能RPA亮相2023全球人工智能技术博览会,“能对话的数字员工”引领智能自动化新篇章

随着ChatGPT火爆全网&#xff0c;人工智能再次成为学术界和科技领域“新宠”&#xff0c;一场“智能革命”的序幕悄然掀开。 6月13日&#xff0c;“智能驱动 砥砺前行”为主题的2023全球人工智能技术博览会在杭州未来科技城学术交流中心圆满落下帷幕。此次博览会以展示智能科技…

Java开发 - 带你了解集群间的相互调用,你还在等什么?

目录 前言 导读 项目准备 集群准备 父工程引入子项目 服务调用方HelloService准备 pom文件 yml文件 Controller文件 服务提供方HelloWorld准备 pom文件 yml文件 Controller文件 运行此两个工程 hello_world组集群 集群调用测试 RestTemplate换成Dubbo行不行…

web基础与HTTP

文章目录 一.web基础1.域名概述2.DNS解析3.阿里云域名申请流程 二.网页1.网页&#xff08;HTTP/HTTPS)1.1 网页1.2 网站1.3 域名1.4 HTTP/HTTPS1.5 URL1.&#xff16;HTML1.7超链接1.&#xff18;发布 &#xff12;. HTML&#xff12;.&#xff11;HTML超文本标记语言&#xff…

人机交互学习-3 交互设计目标与原则

交互设计目标与原则 交互设计目标可用性目标易用性&#xff08;learnability&#xff09;高效率&#xff08;efficiency&#xff09;易记性&#xff08;memorability&#xff09;少出错&#xff08;errors&#xff09;主观满意度&#xff08;satisfaction&#xff09; 用户体验…

C++ 11(2)右值引用 | 移动构造、移动赋值

前文中我们讲解了C11中的部分知识点&#xff0c;下面我们来介绍一下C11中的一个比较重要的知识点右值引用。 右值引用和移动语义 左值引用和右值引用 左值引用 左值就是一个数据的表达式&#xff08;如变量名和解引用指针&#xff09;&#xff0c;我们可以获取它的地址可以…

JD 某工业平台详情API接口PHP接口数据API接口

随着电商市场的蓬勃发展&#xff0c;越来越多的企业正在寻找一种高效、便捷的方式来推销和销售自己的产品。在这个过程中&#xff0c;API接口的使用变得越来越普遍。而京东工业平台商品详情API接口正是一种在推销和销售方面迅速占据市场的技术。 京东工业平台商品详情API接口是…

百度富文本框对接

第一步:引入富文本插件 第二步:修改配置文件 1:ueditor.config.js中,var URL = window.UEDITOR_HOME_URL || getUEBasePath();改为window.UEDITOR_HOME_URL = "http://ip+端口/项目名"; var URL = "http://ip+端口/项目名/.../ueditor/1.4.3/"; …

CORS跨域资源共享漏洞复现——详细利用方法,漏洞危害最大化

文章目录 前言一、漏洞原理以及成因二、CORS漏洞利用总结 前言 在很久很久以前&#xff0c;2021年&#xff0c;我写过一篇关于CORS的漏洞文章&#xff0c;CORS跨域资源共享漏洞靶场演示。当时技术水平欠佳&#xff0c;而且文章内容也仅仅是简单过了一遍漏洞的原理和检测方法&a…

芯片设计全流程概述

芯片设计分为前端设计和后端设计&#xff0c;前端设计&#xff08;也称逻辑设计&#xff09;和后端设计&#xff08;也称物理设计&#xff09;并没有统一严格的界限&#xff0c;涉及到与工艺有关的设计就是后端设计。 1、规格制定 芯片规格&#xff0c;也就像功能列表一样&…

详解c++---AVL树的原理和实现

目录标题 搜索二叉树的缺点什么是AVL树平衡因子的变化规律AVL树的旋转准备工作insert函数模拟实现左旋转右旋转右左双旋左右双旋 AVL树的打印AVL的查找AVL树的检查 搜索二叉树的缺点 在上一篇文章的学习种我们知道了什么搜索二叉树&#xff0c;它让比根小的节点都在根的左边&a…