摆脱匿名类

我真的很喜欢编写和阅读lambda表达式-它们简洁,富于表现力和时尚(来吧,这样就没关系了!)。 将此与匿名类进行比较。 这就是为什么我喜欢摆脱它们!

在过去的几个月中,这种认识慢慢地实现了,昨天,我的潜意识对如何实现这一想法提出了质疑。 我将在这里展示它,并在尝试后的几周内发布后续信息。

总览

为了确保每个人都知道我们在说什么,我将快速回顾一下匿名类。 然后,我将解释为什么在确定他们的最后一个据点以及如何征服它之前要摆脱它们。

匿名类快速回顾

匿名类用于创建接口或抽象类的临时实现,如下所示:

异端阶级的例子

Runnable run = new Runnable() {@Overridepublic void run() {runThisThing(someArgument);}
};

确实确实创建了一个单独的类(您将在包含该代码的类旁边找到它的.class文件),但是由于它没有名称,因此您猜到了它的名称,它被称为匿名类。 我对此的观点始终是,这些课程应该确实很短。 一种,可能有两种方法,有两行。 凡是更长的东西,而且绝对是带有状态的东西,似乎都应该拥有自己的名称和位置–在文件的底部作为嵌套类甚至是自己的名称。 它总是使我无法读取方法,该方法有时会创建10+行的who-knows-what实现,而该实现完全无关。 但是对于简短的实现(如上面的示例),匿名类是最佳选择。

由Mattia Notari在CC-BY-NC-SA 2.0下发布。

发布时间由马蒂亚诺塔下, CC-BY-NC-SA 2.0 。

那他们怎么了?

匿名类没有什么 。 只是在使用lambda表达式和方法/构造函数引用大约一年后,它们似乎是如此笨拙。 我越习惯于简单而准确地表达自己的行为,当面对匿名课堂的仪式和迷惑时,我就越被排斥。

只需将其与上面的示例进行比较:

异端阶级的例子

Runnable run = () -> runThisThing(someArgument);

在过去的几个月中,我逐渐意识到自己不想再看到它们了,昨天我对如何摆脱(必须知道的)必要的剩余事件有了一个很好的想法。

摆脱匿名类

如上所述,我认为比一个或两个方法的简单实现更为复杂的所有事物通常都应以嵌套或独立类的形式获得自己的名称和位置。

(顺便说一句,我倾向于对覆盖现有超类方法以更改其行为的类进行同样的操作。这可能很短,但是如果您不知道现在已被覆盖的原始代码,发现差异并推导意图通常很困难。在大多数情况下,给班级一个好名字可以解决这个问题。)

然后,当然有了Java 8,由于使用了lambda表达式,大量匿名类的用例就消失了。 这很棒! 它也是摆脱它们最后一个据点的工具:“具有几乎所有功能的”接口以及具有一个或两个抽象方法的抽象类的实现。

所以这是我的主意:

当遇到适合自己实现的接口或抽象类时,我们将创建一个功能实现 。 这是一个非抽象类,它将所有方法调用委托给在构造期间指定的功能接口。

我猜一个例子可以澄清这一点:

“几乎功能”界面

public interface ValueListener<T> {void invalidated(T formerValue);void changed(T formerValue, T newValue);}

由于这不是功能接口,因此不能使用lambda表达式创建实现。 相反,您可以在需要时创建一个匿名类:

创建一个匿名实现

ValueListener<String> anonymousListener = new ValueListener<String>() {@Overridepublic void invalidated(String formerValue) {valueInvalidated(formerValue);}@Overridepublic void changed(String formerValue, String newValue) {valueChanged(formerValue, newValue);}
};

相反,我们可以一次创建接口的功能实现:

功能实现

public class FunctionalValueListener<T> implements ValueListener<T> {private final Consumer<T> invalidated;private final BiConsumer<T, T> changed;public FunctionalValueListener(Consumer<T> invalidated,BiConsumer<T, T> changed) {this.invalidated = invalidated;this.changed = changed;}@Overridepublic void invalidated(T formerValue) {invalidated.accept(formerValue);}@Overridepublic void changed(T formerValue, T newValue) {changed.accept(formerValue, newValue);}}

此类的实例可以更简洁地创建,并且不会造成混淆:

实例化功能实现

ValueListener<String> functionalListener = new FunctionalValueListener<>(this::valueInvalidated,this::valueChanged);

另一个例子

实际上触发这个想法的是我在代码库中看到的许多Swing的AbstractAction匿名实现:

Action action = new AbstractAction() {@Overridepublic void actionPerformed(ActionEvent e) {performedAction(e);}
};

这尖叫着“ LAMBDA EXPRESSION!” 但是您不能在抽象类上使用它。 但是在创建只需要使用Consumer<ActionEvent>的功能实现之后,您可以这样做,它看起来像这样:

Action action = new FunctionalAction(this::performedAction);

好多了吧?

跟进

我将尝试几个星期,并报告其工作原理。 我已经看到了一些问题(JDK提供的功能接口的多样性和异常)以及至少一种改善此模式的方法。

但是我认为值得讨论这种方法。 我也这么认为,为什么不分享呢?

您也会尝试吗? 想到更多问题还是需要改进? 也许您只是觉得这很愚蠢? 无论如何,无论您在哪里找到我,都请发表评论,写帖子或ping我。

反射

我表示不喜欢匿名类的冗长和混淆。 长的那些永远不应该放在首位(使它们嵌套类或自己的类),但是短的有时是最佳选择。

通过短接口或抽象类的功能实现,我们可以改用lambda表达式,方法引用或构造函数引用,并从它们的简洁性和可读性中受益。

翻译自: https://www.javacodegeeks.com/2015/04/getting-rid-of-anonymous-classes.html

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

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

相关文章

ARM学习(24)Can的高阶认识和错误处理

笔者来聊一下CAN协议帧的认识和错误处理。 1、CAN协议帧认识 CAN 差分信号&#xff0c;是经过CAN收发器转成差分信号的&#xff0c;CAN RX和TX是逻辑电平。CAN的基础知识&#xff0c;可参考笔者这边文章&#xff1a;ARM学习&#xff08;21&#xff09;STM32 外设Can的认识与驱…

云桌面 瘦终端_小米盒子连接Citrix云桌面

先前看到很多公司使用Wyse、Hp等瘦终端设备登陆Citrix云桌面&#xff0c;便想购得一台瘦终端设备&#xff0c;想来只是为了测试&#xff0c;况且瘦终端价格不低&#xff0c;便一直未买。后使用自己的平板连接Citrix XenDesktop创建的Win7桌面&#xff0c;感觉效果很好&#xff…

Apache Mesos + Marathon和Java EE

Apache Mesos是一个开放源代码群集管理器&#xff0c;可在分布式应用程序或框架之间提供有效的资源隔离和共享。 Apache Mesos从计算机&#xff08;物理或虚拟&#xff09;上提取CPU&#xff0c;内存&#xff0c;存储和其他计算资源&#xff0c;从而使容错和弹性的分布式系统易…

计算机指令中数据寻址的方式,1.变址寻址需要在指令中提供一个寄存器编号和一个数值。 2.计算机的指令越多,功能越强越好。 3.程序计数...

满意答案happysk72推荐于 2017.12.16采纳率&#xff1a;57% 等级&#xff1a;12已帮助&#xff1a;21199人1.对变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加&#xff0c;从而得到一个操作数的有效地址。变址寻址方式常用于访问某基…

babel原理_带你了解 snowpack 原理,你还学得动么(下)

作者&#xff1a;AlienZHOU转发链接&#xff1a;https://zhuanlan.zhihu.com/p/149351900目录带你了解 snowpack 原理&#xff0c;你还学得动么(上)带你了解 snowpack 原理&#xff0c;你还学得动么(下)本篇小编建议小伙们从第一篇开始&#xff0c;按照顺序来看&#xff0c;更清…

测试社交软件有哪些,性格测试:测你适合哪个社交平台

你喜欢通过什么方式和人交流&#xff1f;随着网络世界越来越发达&#xff0c;人们越来越倾向于使用社交工具来维系与家人、朋友、同事之间的关系。不但在现实生活中不好直接表达出来的话通过网上交流的方式可以顺畅地表达出来&#xff0c;而且也节约了时间上的成本&#xff0c;…

VS2012无法安装cocos2d-x-2.1.4 解决方法及VS2012新建coco2d-x项目(一)

转自&#xff1a;http://www.cnblogs.com/wangpei/admin/EditPosts.aspx?opt1 &#xff08;注&#xff1a;此方法是可行&#xff0c;仅供参考&#xff0c;建议大家直接看我的 一见命令解决vs安装并创建cocos2d-x&#xff0c;如果你习惯了和以前一样在vs点击创建就用这个方法&a…

excelexportentity中设置null不显示的方法_一般人不知道的线程间数据交换Exchanger

线程间的数据共享除了定义一个共享数据然后各个线程去访问这种方式外&#xff0c;还可以使用Exchanger交换数据。简单案例首先看看Exchanger的运用&#xff0c;Exchanger最简单的测试代码&#xff0c;如下图&#xff1a;对应打印的结果如下&#xff1a;线程2创建对象java.lang.…

布尔表达式的语法及语义分析程序_XSS语义分析的阶段性总结(一)

作者&#xff1a;Kale 合天智汇前言由于X3Scan的研发已经有些进展了&#xff0c;所以对这一阶段的工作做一下总结&#xff01;对于X3Scan的定位&#xff0c;我更加倾向于主动被动的结合。主动的方面主要体现在可以主动抓取页面链接并发起请求&#xff0c;并且后期可能参考XSStr…

【黑金原创教程】【TimeQuest】【第二章】TimeQuest模型角色,网表概念,时序报告...

声明&#xff1a;本文为黑金动力社区&#xff08;http://www.heijin.org&#xff09;原创教程&#xff0c;如需转载请注明出处&#xff0c;谢谢&#xff01; 黑金动力社区2013年原创教程连载计划&#xff1a; http://www.cnblogs.com/alinx/p/3362790.html 《FPGA那些事儿--Tim…

设置springboot日志级别_Spring Boot 日志框架实践

概述Java应用中&#xff0c;日志一般分为以下5个级别&#xff1a;ERROR 错误信息WARN 警告信息INFO 一般信息DEBUG 调试信息TRACE 跟踪信息Spring Boot使用Apache的Commons Logging作为内部的日志框架&#xff0c;其仅仅是一个日志接口&#xff0c;在实际应用中需要为该接口来指…

计算机加分乘法套用,8+8+8+8+8写成乘法算式要怎样写?小学数学为何这么死板?...

88888写成乘法算式只能写8x5不能写5x8吗&#xff1f;小学数学为何这么死板&#xff1f;这个题目来自于某小学的期考试卷&#xff0c;是个填空题&#xff0c;88888写成乘法算式时给了两个空( )和( )&#xff0c;就有人提出来只能写8x5不能写5x8&#xff0c;所以应该只给一个空。…

投影元素直接隔离_摸着夜色上露台开投影,是巴塞罗那设计师的浪漫

总有人说&#xff0c;世界为你关上一扇门&#xff0c;定会为你留有一扇窗。在家闷上个把月&#xff0c;窗户直接担起了连接人们与外界的通道。既然观众出不了门&#xff0c;那不如让加油打气的海报们&#xff0c;自己爬上墙好了——人们打开窗子就能撞上。平面设计师Ral Goi一直…

Apache Lucene的结构

不可估量的高贵的Apache软件基金会&#xff08;Apache Software Foundation&#xff09;产生了许多重要产品&#xff08;Ant&#xff0c;CouchDB&#xff0c;Hadoop&#xff0c;JMeter&#xff0c;Maven&#xff0c;OpenOffice&#xff0c;Subversion等&#xff09;&#xff0c…

comcerter无法识别串口_基于FPGA 的MXN维字符识别的实现

基于FPGA 的MXN维字符识别的实现1 概述本文的灵感来源于杨淑英老师的一张PPT&#xff08;手写数字识别&#xff09;&#xff0c;在此特别鸣谢杨淑英老师。一般机器视觉对事物是没有感知的&#xff0c;比如摄像头采集到一张苹果的图片&#xff0c;它本身是不知道那是什么东西&am…

构造函数必须没有代码

构造函数中应完成多少工作&#xff1f; 在构造函数内部进行一些计算然后封装结果似乎是合理的。 这样&#xff0c;当对象方法需要结果时&#xff0c;我们将准备好它们。 听起来是个好方法&#xff1f; 不&#xff0c;这不对。 这是一个坏主意&#xff0c;原因有一个&#xff1a…

一个路由器两个网段互通_如何判断两个IP地址是否在同一个网段?什么是子网掩码?...

前几天咱们了解&#xff1a;三种方法告诉你项目超过255个摄像机怎么设置IP?什么是公网ip&#xff1f;什么又是内网ip&#xff1f;为什么ip地址通常以192.168开头&#xff1f;也学习了&#xff1a;二、三层交换机与路由器的区别&#xff01;但是有好多人对IP这个概念还是不太清…

http 路径 |_HTTP 请求與响应的格式及 curl 命令使用

介绍 HTTP&#xff0c;主要内容有HTTP 请求包括哪些部分&#xff0c;如何用Chrome开发者工具查看 HTTP 请求内容HTTP 响应包括哪些部分&#xff0c;如何用Chrome开发者工具查看 HTTP 响应内容如何使用 curl 命令HTTP 请求的格式1 动词 路径 协议/版本 2 Key1: value1 2 Key2: v…

华为y7可以人脸识别吗_华为手机经常弹出“系统更新”提示,可以不更新吗?看完涨知识了...

众所周知&#xff0c;无论是手机&#xff0c;还是电脑&#xff0c;我们所使用的系统到了一定的时间&#xff0c;都会进行“系统更新”&#xff0c;尤其是我们使用的苹果手机、华为手机等&#xff0c;就经常会跳出提示&#xff0c;提醒用户“更新系统”&#xff0c;尤其是当我们…

Apache骆驼丝攻示例

如果您想监视&#xff0c;调试&#xff0c;排除流经路由的消息&#xff0c;而又不必从通道中永久消耗消息&#xff0c;那么就需要使用电线 。 有线分流器充当接收者列表&#xff0c;该列表消耗输入通道之外的消息并将其发布到两个输出通道。 第一个是作为主要信道的实际目的地…