重载方法调用重新设计

2024-03-11

我有一个界面IAction它有一个通用方法:

public interface IAction  {
    void doAction(ISignal sig, IState state);
}

另一堂课IActionAbstract然后实现IAction接口并调用重载方法instanceof条款:

public abstract class IActionAbstract implements IAction
{

@Override
public void doAction(ISignal sig, IState state)
{
    if(sig instanceof ISignal1 && state instanceof IState1)
    {
        doOther((ISignal1)sig, (IState1)state);
    }       
    else if(sig instanceof ISignal2 && state instanceof IState1)
    {
        doOther((ISignal2)sig, (IState1)state);
    }
    else if(sig instanceof ISignal1 && state instanceof IState2)
    {
        doOther((ISignal1)sig, (IState2)state);
    }
}

abstract void doOther(ISignal1 sig, IState1 state);
abstract void doOther(ISignal2 sig, IState1 state);
abstract void doOther(ISignal1 sig, IState2 state);
}

我想删除instanceof检查并替换为泛型或重新设计,但不添加更多方法IAction。我知道如何通过反射来做到这一点,但希望尽可能避免。

编辑:删除了泛型,因为它们不是必需的。我将尝试进行更多解释,以便更好地了解这种方法。这IActionAbstract文件可能是由开发人员生成 impl 来实现这些方法而生成的。ISignal and IState共同使得该方法独一无二,并且可以被认为是状态机状态和信号。

类的用法类似于伪代码:

List<IAction> actions;
actions.get(i).doAction(ISignal1, IState1);
actions.get(i).doAction(ISignal2, IState2);
and so on...

在我看来,您想要单独实现 IAction,即

// generic interface declaration
public interface IAction<T extends ISignal, S extends IState> {
    void doAction(T sig, S state);
}

// typed implementations of the generic interface
public class Action1 implements IAction<Signal1, State1> {
    doAction(Signal1 sig, State1 state) {
        // impl
    }
}

// another typed implementations of the generic interface
public class Action2 implements IAction<Signal2, State2> {
    doAction(Signal2 sig, State2 state) {
        // impl
    }
}

...等等。否则你甚至不会使用泛型。

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

重载方法调用重新设计 的相关文章

  • 如何使用javac编译java包结构

    我正在尝试编译 从命令行 一个 java 包 该包导入我自己的另一个包 我正在关注一个在线教程 http www roseindia net java master java createsubpackage shtml但当我尝试编译最终的
  • 在 JTable 中使用自定义 TablecellRenderer

    我是 Java 新手 我创建了一个JTable 就是这样addRow当我尝试向表中添加一行时 该方法有效 private void addTableRow String type String name String rank String
  • 我们可以在java中放弃已经签名的jar吗?

    I ve a jar文件具有旧签名 并希望使用新签名重新签名 是否可以 如果可能的话 怎么做 如果签名不是您拥有的 您需要先解压 jar 像这样 假设是unix 否则翻译成dos jar xvf JarName jar rm rf META
  • JTree 避免重新加载后崩溃

    我正在尝试找到解决崩溃问题的方法JTree重新加载后 情况 JTree Office A Office A 1 Office A 1 1 Office A 1 2 Office B Office B 1 Office B 1 1 Offic
  • Guice:当 FactoryBuilder 中提供合适的构造函数时,“找不到合适的构造函数”

    我使用 Guice 进行依赖注入 但收到此错误 1 Could not find a suitable constructor in java lang Void Classes must have either one and only
  • 克隆 dom.Document 对象

    我的目的是将xml文件读入Dom对象 编辑dom对象 其中涉及删除一些节点 完成此操作后 我希望将 Dom 恢复到其原始状态 而不实际解析 XML 文件 无论如何 我可以克隆第一次解析 xml 文件后获得的 dom 对象吗 这个想法是避免一
  • Spring批量写入器限制

    我正在工作 Spring Batch 项目 从数据库读取记录然后写入rabbitmq 然后发送到HTTP消息网关 网关有150TPS我需要将我的应用程序限制为 150TPS 有没有办法带弹簧批的油门或者还有其他更好的方法吗 你能行的 在 S
  • 从 java 类生成 xsd 的实用程序

    我想为以下类生成 xsd public class Node private String value private List
  • LibGDX 闪烁

    我已经使用 LibGDX UI 设置来启动一个项目 我在实现 ApplicationListener 中唯一拥有的是 public void create setScreen new LoadingScreen this 这应该会触发 Lo
  • 外部化 Spring Security 配置?

    我有一个 Web 应用程序 可以使用 Spring Security 的几种不同配置 但是 这些差异配置都是在我的 applicationContext 配置文件中设置的 因此 为了在客户站点调整这些内容 必须在 WAR 文件内修改这些内容
  • 在Java中读取制表符分隔的文件

    我有以下代码来读取 Java 中的制表符分隔文件 while str in readLine null if str trim length 0 continue String values str split t System out p
  • Java J文件选择器

    我希望能够控制外观JFileChooser 我特别想保存如何JFileChooser上次显示时显示 我想保存它是否在详细信息 列表视图中使用以及列表被排序的列 例如 大小或修改日期 我知道有很多关于JFileChooser但我一直没能找到我
  • MongoDb Spring 在嵌套对象中查找

    我正在使用 Spring Data Mongodb 和这样的文档 id ObjectId 565c5ed433a140520cdedd7f attributes 565c5ed433a140520cdedd73 333563851 list
  • 如何在 Java 中读取/转换 InputStream 为字符串?

    如果你有一个java io InputStream对象 您应该如何处理该对象并生成一个String 假设我有一个InputStream包含文本数据 我想将其转换为String 例如我可以将其写入日志文件 最简单的方法是什么InputStre
  • 如何解决声纳中的 dodgy:unchecked/unconfirmedcast 问题?

    我在下面的代码中通过声纳获得异常 我该如何解决这个问题 建议我 Override public boolean validate BaseInfo infoObject boolean isValid true AckTransferPay
  • Spring portlet mvc:@Valid 似乎不起作用

    我创建了一个 bean 类并在我的控制器中使用它 但它似乎不起作用 也就是说 即使我输入了无效的年龄 result hasErrors仍然是假的 豆类 public class User Min 13 private int age pri
  • 如何在 iText 7 中创建页面大小不等的文档

    如何在 iText 7 中创建页面大小不等的文档 iText7 可以吗 在iText5中 我使用document setPageSize and document newPage 如果您通过高级 API 添加内容 Document add
  • java中从视频中提取图像

    我想知道如何使用 JMF 从视频中提取图像 Player player Manager createRealizedPlayer cdi getLocator player start FrameGrabbingControl frameG
  • 如何强制 Spark 执行代码?

    我如何强制 Spark 执行对 map 的调用 即使它认为由于其惰性求值而不需要执行它 我试过把cache 与地图调用 但这仍然没有解决问题 我的地图方法实际上将结果上传到 HDFS 所以 它并非无用 但 Spark 认为它是无用的 简短回
  • 如何在 VSCode 中热重载 Tomcat 服务器

    我正在从 Eclipse IDE VSCode 分别用于编码 Java servlet 和 HTML CSS JS 网页 迁移到仅使用 Visual Studio Code 因为它的轻量级 我为 VSCode 安装了几个 Java 扩展 R

随机推荐

  • Symfony 2.8:从 2.7.7 更新到 2.8.0 后 isScopeActive 弃用

    我已经从 2 7 7 更新到 symfony 2 8 并且我得到了这个弃用 Symfony Component DependencyInjection Container isScopeActive 方法自 2 8 版本起已弃用 并将在 3
  • 在 F# 中重放记录的数据流

    我已将实时股票报价记录在 SQL 数据库中 其中包含字段Id Last and TimeStamp 最后是当前股价 双倍 以及TimeStamp is the DateTime记录价格变化的时间 我想以与传入相同的方式重播此流 这意味着如果
  • 为 Django 模型生成非序列 ID/PK

    我即将开始开发新的网络应用程序 其中一部分将为用户提供可以以一对多关系进行自定义的页面 这些页面自然需要有唯一的 URL 留给自己的设备 Django 通常会分配一个标准AUTOINCREMENT模型的 ID 虽然这效果非常好 但看起来不太
  • 从整数流创建平衡二叉搜索树

    我刚刚结束了一次工作面试 我一直在纠结这个问题 在我看来 在 15 分钟的面试中这是一个很难回答的问题 问题是 编写一个函数 给定整数流 无序 构建平衡搜索树 现在 您不能等待输入结束 它是一个流 因此您需要动态平衡树 我的第一个答案是使用
  • 城市和经纬度距离

    我有一张桌子 城市 纬度 经度 我需要一个 sql 查询来了解所有城市距离纽约 100 英里 这是我们的 您可能需要根据您的表结构修改它 我们查找零售地点 和便利设施 而不是城市 但困难的部分是本声明中起作用的 距离最近 CREATE PR
  • python2.5 virtualenv 中的 MySQLdb

    我有一个带有 MySQL 服务器的 Fedora 11 机器 Fedora 11 内部使用 python 2 6 并且 python 2 6 会自动安装在盒子上 我已经为 2 5 5 版本创建了一个 python virtual env 以
  • MySQL max_allowed_pa​​cket 重置

    由于某些超出我所知的原因 我几乎每天都必须重置 max allowed pa cket 有时甚至一天多次 SET GLOBAL max allowed packet 1073741824 我已经沿着这些思路搜索了 MySql bug 的报告
  • CSS 将边框应用于云形状?

    我通过 CSS3 使用不同的方式画了一朵云div我正在尝试为整个形状添加边框 但我遇到了麻烦 因为每个形状都有自己的边框 如何将边框应用于整个云 HTML div div div div div div div div CSS margin
  • Vim 复制行号?

    我通过 SSH 连接使用 vim 我已经设置了数字设置 因此当我尝试用鼠标复制代码部分时 它也会抓取数字 有没有一种复制文本而不抓取数字的好方法 我知道在那个 vim 实例中我可以使用 Y 但我需要一种复制到其他实例和程序的方法 这是我正在
  • OSGI 嵌套依赖 jar

    如果我有一个 OSGI Bundle 其中包含嵌套在 OSGI Bundle jar 中的依赖项 jar 我是否需要在 Import Package 清单中列出这些类以便我可以使用它们 我认为不会 另外 如何将这些依赖项 jar 添加到我的
  • 通过 JDBC 瘦驱动程序连接 Oracle 11g 时出现问题 (Domino Java)

    我无法使用以下代码远程连接 Oracle 11 数据库 但是 如果我尝试连接安装在我的计算机上的 Oracle 9 数据库 相同的代码可以正常工作 缺什么 我没有收到任何错误 Lotus Notes 挂起 import lotus domi
  • 如何使用C++获取文件夹/目录名称,而不是一个文件的路径?特别是 boost::filesystem; [复制]

    这个问题在这里已经有答案了 std string file C folder1 folder2 folder3 txt fs path file path file fs path file dir file path parent pat
  • 成员初始值设定项列表是构造函数的声明或定义的一部分吗?

    请解释如何使用成员初始值设定项列表 我有一个类声明在 h文件和一个 cpp像这样的文件 class Example private int m top const int m size public Example int size int
  • 提高 SQL Server 对大型表的查询性能

    我有一个相对较大的表 当前有 200 万条记录 想知道是否可以提高即席查询的性能 这个单词ad hoc在这里是关键 添加索引不是一个选项 最常查询的列上已经有索引 运行一个简单的查询以返回 100 条最近更新的记录 select top 1
  • 了解 do-while 循环

    我正在做 Oracle 认证助理 Java SE7 程序员练习考试 书本 并遇到一个问题 即使有解释我也不明白答案 这是解释和代码 它将打印 3 循环体执行两次 程序将打印 3 我不明白循环体是如何执行两次的 也许我不明白什么是b b方法
  • JsonPath 与 Newtonsoft.JSON

    我尝试了近一个小时的不同方法 但我不明白 我的 JSON 对象是这样的 typeOfHair value code Dry Hair values value DryHair language en value TrockenesHaar
  • 为什么过滤未排序的列表比过滤排序的列表更快

    我一直在玩 Java 8Streams API我决定进行微基准测试stream and parallelStream 溪流 正如预期的那样parallelStream 速度是原来的两倍 但是会出现其他问题 如果我在将数据传递到之前对数据进行
  • 不使用
    标签是否可以实现类似
    的效果?

    我个人喜欢 fieldset http www w3 org wiki HTML Elements fieldset标签 因为它如何绘制一个盒子并放置 legend http www w3 org wiki HTML Elements le
  • django 中的竞争条件

    下面是一个带有潜在竞争条件的 django 视图的简单示例 myapp views py from django contrib auth models import User from my libs import calculate p
  • 重载方法调用重新设计

    我有一个界面IAction它有一个通用方法 public interface IAction void doAction ISignal sig IState state 另一堂课IActionAbstract然后实现IAction接口并调