检查消息类型时避免使用instanceof

2023-12-19

我遇到以下情况,客户端类根据它收到的消息类型执行不同的行为。我想知道是否有更好的方法来做到这一点,因为我不喜欢 instanceof 和 if 语句。

我想做的一件事是将方法从客户端类中取出并将它们放入消息中。我会将类似 process() 的方法放入 IMessage 接口中,然后将消息特定行为放入每个具体消息类型中。这将使客户端变得简单,因为它只调用 message.process() 而不是检查类型。然而,唯一的问题是条件语句中包含的行为与 Client 类中包含的数据操作有关。因此,如果我确实在具体消息类中实现了一个处理方法,我就必须将它传递给客户端,而且我也不知道这是否真的有意义。

public class Client {
    messageReceived(IMessage message) {
        if(message instanceof concreteMessageA) {
            concreteMessageA msg = (concreteMessageA)message;
            //do concreteMessageA operations
        }
    }
        if (message instanceof concreteMessageB) {
            concreteMessageb msg = (concreteMessageB)message;
            //do concreteMessageB operations
        }
}

避免instanceof测试的简单方法是多态分派;例如

public class Client {
    void messageReceived(IMessage message) {
        message.doOperations(this);
    }
}

其中每个消息类定义了适当的doOperations(Client client) method.

编辑:第二个解决方案更符合要求。

用 switch 语句替换一系列“instanceof”测试的替代方法是:

public class Client {
    void messageReceived(IMessage message) {
        switch (message.getMessageType()) {
        case TYPE_A:
           // process type A
           break;
        case TYPE_B:
           ...
        }
    }
}

每个 IMessage 类都需要定义一个int getMessageType()方法返回适当的代码。在我看来,枚举与整数一样工作,而且更优雅。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查消息类型时避免使用instanceof 的相关文章

  • SLF4J - Logback:如何在运行时配置记录器?

    我们在项目中使用 LogBack 我想根据一些数据库值配置记录器 即如果某个数据库值设置为 true 则记录器应同时使用文件和数据库附加程序 如果为 false 则记录器必须仅使用数据库附加程序 我还想保留使用静态最终记录器 因此我不会在每
  • Java:BufferedReader readLine() 中的 IOEXception 有何用途?

    我可以使用 try catch 循环 修复 以下异常 但我无法理解原因 为什么 in readLine 部分会不断引发IOExceptions 抛出此类异常的真正目的是什么 目标可能不仅仅是更多副作用 代码和 IOException jav
  • spring boot框架下如何过滤tomcat产生的访问日志

    我们使用spring boot框架 通过嵌入式tomcat生成访问日志 访问日志的格式如下 server tomcat access log enabled true server tomcat access log pattern h l
  • 在 Java 和 C 中在运行时调用名为“string”的方法

    我们如何调用名称为的方法string在运行时 谁能告诉我如何在 Java 和 C 中做到这一点 在java中可以通过反射api来完成 看一下Class getMethod String methodName Class parameterT
  • Hibernate HQL 查询:如何将集合设置为查询的命名参数?

    给定以下 HQL 查询 FROM Foo WHERE Id id AND Bar IN barList I set id使用查询对象的setInteger 方法 我想设置 barList用一个List对象 但查看 Hibernate 文档和
  • Maven:缺少工件 org.springframework:spring:jar:4.2.6

    我在 SpringToolSuite 中有一个动态 Web 项目 它被转换为 Maven 项目 我遇到问题 缺少工件 org springframework spring jar 4 2 6 我已经尝试清理 重建和运行该项目 它给 读取文件
  • Spring @Transactional 并发

    class MyService 公共无效a 同步 某个键 b Transactional 传播 传播 REQUIRES NEW 公共无效b 数据库工作吗 除非您使用代码编织 否则这是行不通的 Spring处理事务的默认方式是通过AOP代理
  • 内容安全策略:页面设置阻止自行加载资源?

    我有基于 Java 的 Web 应用程序运行在Tomcat http en wikipedia org wiki Apache Tomcat6 我的应用程序在本地主机和端口 9001 上运行 为了使我的应用程序更加安全并降低风险XSS ht
  • 使用 java.nio.file.Paths 接口时缺少方案(IllegalArgumentException)

    这是一个非常简单的java问题 我在 Linux 系统上使用 Java 8 和 eclipse kepler 我一直在尝试尝试NIO 2 我的代码是 package lucasTest import java io IOException
  • 如何从 REstAssured 中的 Json 数组获取 JSON 对象

    任何人都可以帮我解决这个场景 我是新来的RestAssured和处理JSON在我们的自动化脚本中 我有一个API谁的回应是JSONArray i e id 1002 entity testcase fieldName TextName di
  • 获取运行时生成的类的字节

    我正在使用一个 Java 框架 该框架使用自定义类加载器在运行时生成一些 代理 类 我想为任何这样的类获取自定义 ClassLoader 从 loadClass 返回的与该类对应的原始字节数组 这可能吗 我知道 如果一个类作为资源存在 那么
  • 如何在 apache poi 中找到包含图片的单元格

    我尝试在 xls 文档中循环图像 我写下一个代码 HSSFPatriarch patriarch sheet getDrawingPatriarch if patriarch null Loop through the objects fo
  • 为什么 Libgdx 的 Table 不接受缩放操作?

    我在 libgdx 库中使用 scene2d 在游戏中创建一些 UI 我使用了一个表格 我想在用户触摸时采取一些缩放操作以使按钮触摸有意义 当我使用任何其他 Actor 类型 例如 Group 并为其提供缩放操作时 它可以工作 但不能工作表
  • Spring Data elasticsearch @Query 注解嵌套对象

    我有两节课 Document public class PracticeQuestion private int userId private List
  • Java 通用问题

    下面的代码可以编译 但如果我取消注释行 它不会编译 我很困惑为什么 HashMap 确实扩展了 AbstractMap 并且声明映射的第一行可以正常编译 import java util AbstractMap import java ut
  • 使用 colt java lib 时出现“矩阵太大”异常

    我正在使用 cern colt matrix lib 进行稀疏矩阵计算 但似乎我一直遇到此错误 线程 main 中的异常 java lang IllegalArgumentException 矩阵太大 我认为这是因为构造函数在 nrows
  • Java可以进行进程监控吗?

    是否可以用Java编写一个在托盘中运行的应用程序 并且当启动某个应用程序时 它可以检测到它 我想对某些程序执行此操作 以了解我每周使用它们多长时间 我是 Java 新手 所以我不知道 Java 是否是最适合此操作的语言 或者它是否具有对操作
  • 我可以从同一个 jar 文件执行两个不同的类吗?

    我有一个项目 在一个包中我制作了服务器 在第二个包中我制作了客户端 它运行良好 我想创建一个 Jar 文件 是否可以使用同一个 jar 文件分别运行客户端和服务器 我使用了只有一个 main 的 jar 文件 当我运行 jar 文件时 它会
  • 如果可能,将 jFrame 输出到第二台显示器

    我在 Java 中的 Swing 上有一个 jFrame 我希望它输出到第二个监视器 如果该监视器存在 我尝试过这个 通过this http download oracle com javase 6 docs api java awt Gr
  • Selenium Webdriver 中的 IF 语句

    我想知道是否有人可以帮助我解决我正在尝试解决的问题以及 Java 中 Webdriver 的 If 语句 当登录到我正在测试的应用程序时 可以在主页之前进入安全问题页面 如果是新用户等 我希望测试中的代码做的是 如果出现安全问题页面 请填写

随机推荐

  • 使用 taskkill /F 返回代码 0 终止进程

    我需要终止一个 Windows 进程 java exe 我目前正在使用 taskkill exe F IM java exe 我需要使用 F 选项 因为这是一个关键进程 但这样我得到返回代码 1 而不是我需要返回代码 0 当我不使用 F 杀
  • 在 Visual Studio 中自动创建处理程序签名

    在 c asp net 4 0 VS2015 中工作 我创建了一个用户控件 它只是一个下拉列表 其中包含用户可以传递给它的几个其他属性 以及一个事件和委托 当下拉列表更改时 会触发 OnSelectedIndexChanged 然后检查事件
  • 我的 ASP.NET MVC 应用程序结构是否正确?

    我已经阅读了教程 特别是使用 Linq To Entities 的教程 并且了解基本概念 但是有些事情给我带来了问题 这些教程通常只涉及简单的模型和表单 仅使用基本的创建 更新和删除语句 我的有点复杂 我不确定我是否以正确的方式处理这个问题
  • 提取数据库对象的代码或脚本

    我需要从所有函数 过程 包 视图和表中提取代码 脚本 以便当我转向生产时我可以运行脚本来创建所有对象 在开发过程中 我没有对所有数据库对象进行脚本备份 提取代码或脚本的最佳方法是什么 任何建议或帮助都非常值得赞赏 Thanks 您确实使用版
  • 我可以将值为“未定义”的字符串转换为实际的未定义吗?

    当我从前端发出 GET 请求时 我将几个查询参数应用于 URL 如下所示 let response await axios get products searchQuery this searchQuery categoryId this
  • 调用结构体的方法

    这段代码工作正常 feedService postgres FeedService feeds err feedService GetAllRssFeeds 但这段代码给了我错误 feeds err postgres FeedService
  • Bootstrap:向导航栏添加按钮组?

    添加一个是否足够容易btn group to navbar in bootstrap btn很好 但不太好 当btn group div 在Bootstrap3中 您可以添加一个navbar btn类给你的按钮让它们垂直对齐 即使在btn
  • Android中可以使用哪些编程语言进行开发? [复制]

    这个问题在这里已经有答案了 可能的重复 我可以在 Android Dalvik 上使用哪些编程语言 https stackoverflow com questions 1994703 which programming languages
  • 计算百分比Javascript

    我有一个关于 JavaScript 逻辑的问题 我用什么来从文本字段获取两个输入的百分比 这是我的代码 var pPos pointspossible val var pEarned pointsgiven val var perc pEa
  • R 中的部分合并

    在我最终达到 7之前r中数据帧之间的两两匹配 https stackoverflow com questions 12123013 two by two matching between dataframes in r是的 让我说我已经阅读
  • Android textview html 字体大小标签

    I use font size 4 android textview 中的标签像这样 resultTextView setText Html fromHtml font size 4 color 337744 Text Message fo
  • 突出显示缓冲区修改

    文件缓冲区经常被修改 废话 退出之前 emacs 会询问是否保存更改 现在了解到底发生了什么变化将会很有趣 有办法找出来吗 As of Emacs 22 1 at least save buffers kill emacs the defa
  • MigraDoc 表超出了第 2 页的标题?

    您好 我在 MigraDoc 中制作了一个大型表格 当表格对于页面而言太大时 它会自动拆分表格 我的页眉中有一个徽标 当我的表格转到第 2 页时 它位于徽标上方 而不是在徽标下方 有人知道如何确保它在移动到其他页面时消失吗 这是徽标代码 就
  • ModuleNotFoundError:没有名为“setuptools._distutils”的模块

    当我在 python 中安装以下包时遇到异常 pip install django microsoft auth 例外 ModuleNotFoundError No module named setuptools distutils 这里有
  • 为 Android 手机和平板电脑创建不同的布局

    这是一个基本的安卓问题 我的应用程序需要为手机和平板电脑提供不同的屏幕设计 手机需要有一个 ListView 平板电脑需要有一个项目的 GridView 我想知道如何在不制作两个不同的应用程序的情况下做到这一点 Thanks 基本上你必须为
  • C++ 控制台屏幕尺寸

    所以我在大学里学习了一些关于 C 的东西 我和老师就如何将文本实际居中到输出屏幕进行了讨论 所以我的建议是使用setw但得到字符串的长度和size在控制台屏幕上 进行算法和 BAM 我们就有了真正居中的文本 他说屏幕尺寸是80但屏幕可以调整
  • 清单文件无效

    我成功上传了扩展程序的新版本到 Chrome 应用程序 https chrome google com webstore detail producteev auto login dbmjalgigkhfhmckigghggodkafpfd
  • 是否可以使用默认的 Windows 凭据以非交互方式对远程 Git 存储库进行身份验证?

    我的远程 Git 存储库由本地 TFS 服务器托管 有两种方法可以访问其内容 使用 TFS Restful API https learn microsoft com en us rest api vsts git items get vi
  • Microsoft Graph API 用于读取分配给 Teams 用户的电话号码

    是否有任何 MS Graph API 可以读取分配给 Teams 用户的电话号码以进行直接路由 请通过 它返回一组默认属性businessPhones displayName givenName id mobilePhone officeL
  • 检查消息类型时避免使用instanceof

    我遇到以下情况 客户端类根据它收到的消息类型执行不同的行为 我想知道是否有更好的方法来做到这一点 因为我不喜欢 instanceof 和 if 语句 我想做的一件事是将方法从客户端类中取出并将它们放入消息中 我会将类似 process 的方