以编程方式实现一个接口,该接口以各种指定的方式组合同一接口的一些实例

2024-01-15

实现以各种指定方式组合同一接口的一些实例的接口的最佳方法是什么?我需要对多个接口执行此操作,并且希望最大限度地减少样板文件并仍然实现良好的效率,因为我需要为关键的生产系统执行此操作。

这是问题的草图。

抽象地说,我有一个通用的组合器类,它接受实例并指定各种组合器:

class Combiner<I> {
   I[] instances;

   <T> T combineSomeWay(InstanceMethod<I,T> method) {
     // ... method.call(instances[i]) ... combined in some way ...
   }

   // more combinators
}

现在,假设我想实现以下接口以及其他接口:

Interface Foo {
  String bar(int baz);
}

我想最终得到这样的代码:

class FooCombiner implements Foo {
  Combiner<Foo> combiner;

  @Override 
  public String bar(final int baz) {
    return combiner.combineSomeWay(new InstanceMethod<Foo, String> {
      @Override public call(Foo instance) { return instance.bar(baz); } 
    });
  }
}

现在,如果接口有很多方法,这很快就会变得冗长而冗长。我知道我可以使用 Java 反射 API 的动态代理来实现此类接口,但通过反射访问方法要慢一百倍。那么在这种情况下,除了样板文件和反射之外还有什么替代方案呢?


我会建议动态代理 - 它真的比现在的常规方法调用慢得多吗 - 我听说反射在幕后发挥了相当大的魔力来加速重复的方法调用。 (如果速度慢了 100 倍,你确定你会注意到吗?好吧,只需重新阅读你的问题 - 你就会注意到!)

否则,您的问题基本上已经有了解决方案:使用 Command 对象将每个方法包装在您的界面中。然后,您可以将接口集合中的每个实例传递给命令对象进行处理。

当然,如果您有勇气和冒险精神,您可以使用动态类生成(使用 cglib、javassist 等)来生成命令对象的实现以及组合器接口的实现动态字节码生成器 http://java-source.net/open-source/bytecode-libraries。这将避免样板文件。

您还可能在方面方面取得一些成功,特别是在编译时或加载时编织方面的aspectJ,因此您可以避免反射开销。抱歉我无法提供详细信息。

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

以编程方式实现一个接口,该接口以各种指定的方式组合同一接口的一些实例 的相关文章

随机推荐

  • 使用不同的输入参数多次运行 Fortran 代码

    我想使用不同的输入参数集多次运行 Fortran 77 程序 我已经确保输出文件名会根据我使用的不同输入参数而更改 但我不确定如何运行具有不同输入参数集的程序 而不必每次都转到代码来更改参数 为了说明我的问题 这里有一个简单的代码 PROG
  • 带皮肤的 BottomSheetDialogFragment 主题

    如何结合BottomSheetDialogFragment主题与其他主题 我的应用程序具有使用主题制作的皮肤 BottomSheetDialogFragment应该有圆角 我使用以下方法实现这一点 override fun onCreate
  • 为 iPhone 创建组合框 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 由于没有预先存在的用于创建组合框 或选择框 的组件 如通过 Safari 在网页上看到的那样 有人可以
  • 如何将kinect的深度图像与彩色图像对齐

    Kinect 上的颜色和深度传感器生成的图像略有不对齐 我怎样才能改变它们以使它们对齐 关键是调用 Runtime NuiCamera GetColorPixelCoordinatesFromDepthPixel 这是 Runtime 类的
  • 4-5-4 国家零售基金会日历 csv 下载或创建函数

    我一直在谷歌上到处搜索 但没有找到这个 我工作的零售客户使用 NRFretail 日历 NRF site http nrf com 我想知道是否有人曾经使用这些值创建过查找 维度表 Thanks 您可以找到一个 perl 模块 可以在 CP
  • 如何在 iOS 中裁剪视频

    我正在查看 Apple 提供的 RosyWriter 示例代码作为起点 我想找到一种裁剪视频的方法 所以我有 iPhone 相机的全分辨率视频 但我只想使用其中的裁剪部分 并旋转该子部分 我认为在captureOutput didOutpu
  • 如何在wxPython中制作类似日志框的东西

    我假设这可以通过多行文本框实现 但不确定如何做到这一点 我想做的是在我的 wxPython 程序中创建一个日志框 当某些操作发生时我可以在其中写入消息 另外 我不仅需要在事件发生时写入消息 还需要在代码中的某些时间写入消息 我如何才能重绘窗
  • Castle Windsor:当我的程序集无法访问基础类型时,如何注册工厂方法?

    我有一个项目 其中我的业务层是使用 DI 构建的 但我正在尝试采取额外的步骤并使用 Windsor 来管理对象构建 假设我有一个预先存在的数据层 我不想修改 可以通过以下接口访问 interface IDataFactory IDataSe
  • jQuery 在网站/内容加载后淡入淡出?

    是否有任何教程或插件可以在网站正确加载后淡入视图 以限制任何不和谐等 使内容基本上顺利显示 我想如果它只是一个特定区域会更容易 因为页眉或页脚已经被缓存 从以前的页面 例如 带有各种缩略图的作品集页面 它们只有在准备好后才会顺利显示 这可以
  • 如何告诉 Django,memcached 运行时的项目大小大于默认值?

    我使用新设置来增加 memcached 中的项目大小 但我无法通过 Django 后端存储大于 1mb 的内容 我知道memcache模块需要一些设置来实现这一点 Django 在后端使用这个模块 From memcache py 可以保存
  • Android 如何传递 Activity.class 作为函数的参数

    我最近从 Python 迁移到 Android 但被困在这里 这是我的类声明 用于为接受必要参数的警报对话框创建一个通用函数 public static AlertDialog Builder getAlertDialog String s
  • 我可以在 MVC 3 中拥有/链接 1 个以上的 _Layout 页面吗?对于 cshtml 页面?

    我有一个布局页面和一些使用它的页面 但我想在一些使用它的子页面上实现导航控件 所以我想使用另一个嵌套布局页面 这可能吗 是的 效果很好 只需告诉您的布局页面使用另一个布局页面 Layout pathToMyOtherLayout 您还可以使
  • Android - 调用默认浏览器并重定向到指定的网址

    Hi我想编写一个应用程序来调用默认浏览器并重定向到指定的网址 任何建议 1 调用默认浏览器 2 重定向到指定的 url Thanks 您只想使用网页的 Uri 作为数据元素来启动 ACTION VIEW 意图 Intent httpInte
  • this._mouseInit() 不是一个函数

    我刚刚将代码更新到 jqueryui 1 8 它给了我这个错误 this mouseInit is not a function 我该如何解决这个问题 我有一个可以让鼠标开始拖动和停止的小部件 这是我的代码 widget ui boxToo
  • header('P3P: CP="CAO PSA OUR"'); 是什么意思?做?

    What is header P3P CP CAO PSA OUR for 如何 为什么让这个脚本在 IE 中正常工作 session start if session is registered pre myusername header
  • javascript中相对路径和绝对路径的区别

    有一些小的澄清 据我所知 这些是相对路径和绝对路径 Completely relative img src kitten png Absolute in all respects img src http www foo com image
  • 位置为绝对的元素上的垂直空间

    我如何制作元素position absolute and 动态高度仅使用 css 占据垂直空间 我可以使用容器和显示方面的技巧吗 不幸的是 根据定义 使用绝对定位意味着您的元素不再占用空间 所以不行 只能通过css没有办法做到这一点 您当然
  • 如何检查多值参数中是否选择了某个值

    在 SSRS 2008 中 我使用多值参数为特定参数选择多个值 在我的报告中 我有条件格式 如果选择了该项目 则特定标签必须为蓝色 否则它会保持黑色 我的直觉是尝试使用 SQL 方式 但我错了 Switch Fields groupType
  • 在 C++ 中返回错误代码的正确方法是什么

    我正在使用错误代码来处理我的 C 项目中的错误 问题是如何从应该返回某些变量 对象的函数返回错误代码 考虑一下 long val myobject doSomething 这里 myobject 是某个类的对象 如果 doSomething
  • 以编程方式实现一个接口,该接口以各种指定的方式组合同一接口的一些实例

    实现以各种指定方式组合同一接口的一些实例的接口的最佳方法是什么 我需要对多个接口执行此操作 并且希望最大限度地减少样板文件并仍然实现良好的效率 因为我需要为关键的生产系统执行此操作 这是问题的草图 抽象地说 我有一个通用的组合器类 它接受实