`
DDT_123456
  • 浏览: 16285 次
社区版块
存档分类
最新评论

delegatej

 
阅读更多

 

(via: http://dreamhead.blogbus.com/index_4.html)

缘起

在Java里,为了启动一个线程,我们要创建一个实现Runnable接口的类:

public class MyParallelComputer implements Runnable {
  pulbic void run() {
    ...
  }
}

new Thread(new MyRunner()).start();

再有,为了响应一个按钮的事件,我们要创建一个ActionListener接口的类:

button.add(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    ...
  }
});

所有这些,其实,我们需要的并不是一个类,而是满足一定约定的调用接口,只是因为我们用的是Java,让我们别无选择。做同样的事情,对比其它程序设计语言:

  • 很多程序设计语言里有lambda,甚至连方法名都可以省掉
  • C#里有delegate,只要方法的入参和返回值兼容,方法名也不重要
  • 即便是C,用函数指针,也只限定了入参和返回值,方法名也不重要

对比来看,Java的实现有两点堪称多余,类型和方法名。

在面向对象设计中,继承一种非常强的关系。虽然在语法层面上,我们只是简单地extends或implements一个类型,但实际上,背后隐藏着好多概念,比如is-a,比如LSP,所以,继承关系必须让我们小心翼翼,确保继承真的是继承。

再来看方法名,从之前几种程序设计语言的对比来看,对于这个调用接口而言,我们真正关心的只是入参和返回值,而方法名并不是我们的重点,而且,在现代程序设计中,方法名扮演着文档的作用,而实现这样的调用接口,我们不得不遵循这个死板的名字。所以,现实中经常的做法是,有一个按照自己意图命名的方法,在这个死板的方法中调用。

好吧,说了Java实现诸多的问题,接下来自然是要解决这样的问题,一起看看我们的主角:delegatej。

起步走

delegatej是一个基于annotation实现的delegate。从前面的介绍里面,你已经知道delegatej要解决问题是什么了。下面我们就来看看,如何应用delegatej。

假设我们有一个要实现的接口

public interface Executable {
    String execute(String name);
}

既然是一个基于annotation的实现,我们自然要有一个annotation,它就是给方法做标记的:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Handle {
}

再来,我们有一个要实现Executable接口的方法:

public class Runner {
    @Handle
    public String hello(String name) {
        return "hello " + name;
    }
}

与实现接口不同的是,这里只是用annotation标记了方法,没有强硬的继承关系,方法名也与接口标记的完全不同,相同的只是入参和返回值而已。要把这样的方法对接到接口上,就是delegatej发挥作用的地方了:

  Executable executable = delegate(Handle.class).to(Executable.class).trait(new Runner());
  executable.execute("dreamhead"); // "hello dreamhead"

这段代码的意思很清楚,把Handle这个annotation标记的方法委托给(delegate to)Executable接口的实现,然后,用这个约定从一个对象(new Runner())压榨(trait)出对应的方法来。这样一来,我们就得到了一个Executable接口的实现,也就可以当做Executable来用了,执行这个方法时,就会调用到hello方法。

同样,那个启动线程的例子就可以稍微修改一下:

public class MyParallelComputer {
  @Parallel
  pulbic void compute() {
    ...
  }
}

Runnable runnable = delegate(Parallel.class).to(Runnable.class).trait(new MyParallelComputer());
new Thread(runnable).start();

至于那个响应按钮事件的例子,就留给你做练习了。

分享到:
评论

相关推荐

    chrome拓展Grammarly、google浏览器插件Grammarly

    google浏览器插件Grammarly,智能文本校对插件,帮助检查语法、拼写和标点符号错误,适用于英文写作‌

    2024年青海省村级(居委会)行政区划shp数据集.zip

    村级(居委会)行政区划shp矢量数据 坐标系: wgs1984 字段包含: 村名称:village 乡镇名称:town 县名称:district 市名称:city 省名称:province

    基于STM8单片机的CAN主动定时发送数据.zip

    基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助

    视频编码标准VVC中增强电影胶片颗粒处理方法:提升视觉质量和效率

    内容概要:本文详细探讨了在Versatile Video Coding (VVC)开源实现中对电影胶片颗粒的高效编码,着重介绍了Fraunhofer VVenC中的影片颗粒分析模块(FGA)与VVdeC中的影片颗粒合成模块(FGS)。研究描述了这两个模块的技术实现方式,特别是补充增强信息(SEI)参数用于信令化影片颗粒特征的方法。通过主观和客观评估表明,所提出的FGA和FGS方法能显著改进编码视频的视觉质量,特别是在低比特率编码环境下,可以有效掩盖压缩伪影,从而提高观众观看体验。 适合人群:视频编码研究员和技术开发者、多媒体应用开发者和对高质量视频编码有兴趣的专业人士。 使用场景及目标:适用于需要处理高分辨率视频并关注压缩效率和视效质量的各种多媒体应用场景,如影视制作、在线流媒体、虚拟现实以及沉浸式体验等。通过引入受控噪点来掩盖因压缩而产生的失真现象,从而优化视觉表现效果。 其他说明:文章指出了现有传统评价指标对于纹理敏感性和感知度方面不足的问题,强调未来应当发展更适合评价此类特性的新型测量标准。同时,在实际运用过程中还需平衡计算开销的影响因素,以确保高效的编解码性能。

    安卓项目源码Android个人记账程序源码

    安卓项目源码Android 个人记账程序源码提取方式是百度网盘分享地址

    天池大数据比赛,贵州智慧交通预测.zip

    天池大数据比赛,贵州智慧交通预测GZ_旅行时间天池大数据比赛,贵州智慧交通预测 代码主要包括数据的一些预处理,生成神经网络的xy文件,结果的比较与展示,全链接神经网络的代码以及ARIMA的部分代码

    用于黑莓OS7杀掉进程的程序,比如强制关闭BBW还有短信等

    亲测可用于黑莓OS6和OS7

    26页-基于AI人工智能的智慧校园综合解决方案AI+智慧校园综合解决方案.pdf

    在21世纪的科技浪潮中,人工智能(AI)无疑是最为耀眼的明星之一,它以惊人的速度改变着我们的生活、工作乃至整个社会的运行方式。而在人工智能的广阔领域中,大模型(Large Models)的崛起更是开启了智能技术的新纪元,引领着AI向更加复杂、高效、智能的方向发展。本文将深入探讨人工智能大模型的内涵、技术特点、应用领域以及对未来的影响。 一、人工智能大模型的内涵 人工智能大模型,顾名思义,是指具有庞大参数规模和数据处理能力的AI模型。这些模型通过深度学习算法,在海量数据上进行训练,能够学习到丰富的知识表示和复杂的模式识别能力。与传统的小型或中型模型相比,大模型在理解自然语言、生成高质量内容、进行跨模态信息处理等方面展现出前所未有的优势。它们不仅能够执行特定的任务,如图像识别、语音识别,还能进行创造性的工作,如文本生成、音乐创作,甚至在某些情况下展现出接近或超越人类的智能水平。 二、技术特点 海量数据与高效训练:大模型依赖于庞大的数据集进行训练,这些数据涵盖了广泛的主题和情境,使得模型能够学习到丰富的语义信息和上下文理解能力。同时,高效的训练算法和硬件加速技术,如TPU(Tensor Processing Unit)和GPU,使得大规模模型的训练成为可能。 自注意力机制与Transformer架构:许多领先的大模型采用了Transformer架构,特别是其自注意力机制,这种设计使得模型在处理序列数据时能够捕捉到长距离依赖关系,极大地提高了模型的表达能力和泛化能力。 多任务学习与迁移学习:大模型通常具备多任务学习的能力,即在一次训练中同时学习多个任务,这有助于模型学习到更通用的知识表示。此外,迁移学习使得这些模型能够轻松适应新任务,只需少量额外数据或微调即可。

    基于labview的声卡数据采集系统与分析设计毕业论文

    基于labview的声卡数据采集系统与分析设计毕业论文

    甲醇市场潜力无限:2024年全球甲醇市场销售额达到了487.5亿美元

    甲醇市场潜力无限:2024年全球甲醇市场销售额达到了487.5亿美元 在能源与化工领域,甲醇作为一种多功能的化学品,正以其独特的优势和广泛的应用领域,成为市场关注的焦点。从基础的化工原料到新兴的清洁能源,甲醇的角色愈发重要。然而,面对全球甲醇市场的复杂多变,如何精准把握市场动态,洞悉未来趋势,成为企业和投资者亟待解决的问题。本文将深入探讨甲醇市场的概况、技术创新、应用领域以及竞争格局,同时强调咨询服务在把握市场脉搏中的关键作用。 市场概况 据QYR(恒州博智)统计,2024年全球甲醇市场销售额达到了487.5亿美元,预计至2031年将增长至497.6亿美元,尽管年复合增长率(CAGR)仅为0.3%(2025-2031),但这一稳定增长的态势仍彰显了甲醇市场的坚实基础和持续潜力。 地区分布与变化: 地区层面,亚太市场是全球甲醇市场的领头羊,占有约63%的市场份额,北美和欧洲则分别占比15%和12%。中国市场作为亚太地区的重要组成部分,近年来变化迅速,其市场规模和全球占比均呈现出显著的增长态势。 技术创新与趋势 甲醇生产技术的不断创新是推动市场发展的重要动力。从传统的合成气制甲醇工艺到新兴

    基于Django和orm的管理系统的开发文档

    在b站跟着武沛奇老师的视频学习的Django开发,然后边学边写开发文档帮助自己理解和复习

    个人用The system is: Linux - 6.8.0-50-generic - aarch64 Compiling the C compiler identification source

    个人用The system is: Linux - 6.8.0-50-generic - aarch64 Compiling the C compiler identification source

    网络安全-渗透攻防知识点面试题整合

    超全知识点,用来学习都可以。

    基于STM8单片机的电子时钟定时驱动继电器输出实验.zip

    基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助

    基于python的人脸识别智能化小区门禁管理系统源码数据库论文.docx

    基于python的人脸识别智能化小区门禁管理系统源码数据库论文.docx

    [大数据课程作业]分别采用神经网络、线性回归、SVM方法预测学生成绩.zip

    [大数据课程作业]分别采用神经网络、线性回归、SVM方法预测学生成绩学生成绩回归这个项目是我大数据课程的作业之一。这是什么这是我的2017大数据课的作业。老师提供一组包含学生成绩与校园卡消费记录的数据。我对数据进行预处理后,分别采用神经网络、线性回归和SVM方法对学生学习成绩进行了回归。准确率为78%。结果表明,学生经常去图书馆自习、每天在食堂吃饭不超过16块且前3学期学习成绩达到优秀的学生,在第4学期很可能再次达到优秀。该结果只针对次数据集。用到的库与工具硬numpysklearn

    基于S7-200 PLC和MCGS组态的灌装贴标生产线系统 带解释的梯形图程序,接线图原理图图纸,io分配,组态画面

    基于S7-200 PLC和MCGS组态的灌装贴标生产线系统 带解释的梯形图程序,接线图原理图图纸,io分配,组态画面

    静态补偿电压仿真模型(Harnefors Observer)Matlab 2020b版本 该观测器来源Harnefors教授lunwen Synchronization at startup and

    静态补偿电压仿真模型(Harnefors Observer)Matlab 2020b版本 该观测器来源Harnefors教授lunwen 《Synchronization at startup and stable rotation reversal of sensorless nonsalient PMSM drives》中提到的观测器 该观测器有以下优势: 1.理论上完全证明了初始角度无论误差多大都能保证最终估算角度收敛。 2.lunwen中提供的参考C代码就十行左右,原理清楚,结构简单。 3.只有一个LAMBDA参数需要调整,文章上也给出了建议范围,即略微大于2,相当于基本不需要调参,观测器通用性非常强。 4.启动及低速控制对定子电阻变化不敏感。 仿真模型特点: 1.仿真模型使用离散化模型,与真实数字化执行结果相近。 2.仿真模型使用标幺化形式,方便替电机参数观测仿真结果。 3.lunwen中分析的仅用于表贴式电机,仿真模型使用有效磁链概念拓展到表贴和内嵌电机通用。 4.M文件中提供了电机初始角度参数,可任意设定初始角度,观察观测器角度收敛情况。 实际仿真:任意初始角度都可以启动

    永磁同步电机模型参考自适应无传感器矢量控制仿真,永磁同步电机MRAS仿真 采用模型参考自适应控制,实现中高速稳定控制; 转速采用锁相环PLL得到; MRAS控制的主要思路是以不含有位置参数的电机方程作

    永磁同步电机模型参考自适应无传感器矢量控制仿真,永磁同步电机MRAS仿真 采用模型参考自适应控制,实现中高速稳定控制; 转速采用锁相环PLL得到; MRAS控制的主要思路是以不含有位置参数的电机方程作为参考模型,将待估计参数的方程作为可调模型。 利用两个模型输出量差值构建适当的自适应律来实时调节可调模型的参数,使得可调模型的输出跟踪参考模型的输出。

    Kwan Amy, Nacke Kai - Learn LLVM 17, 2nd. Edition - 2024

    Kwan Amy, Nacke Kai - Learn LLVM 17, 2nd. Edition - 2024

Global site tag (gtag.js) - Google Analytics