java8 默认方法_如何不使用Java 8默认方法

java8 默认方法

警告:一旦阅读,您将无法看不到它

我在上一篇博客文章中讨论了默认方法的多重继承,以及它们在编译和运行时的行为。 这周,我将研究如何使用默认方法进行真正的继承,实际上,默认方法并非为之设计的。 出于这个原因,请您自担风险阅读这些行,并不意味着这是要遵循的模式,同样也并不意味着相反。 我在这里写的是一些可以使用Java 8编写的编码技术,但其可用性至少对我来说是个问题。 我也有点害怕从瓶子里放一些香水 ,但另一方面,那些香水根本就不会留在那里。 总有一天有人会说出来。 至少我附上了警告标志。

样本问题

几年前,我在一个应用程序上工作,该应用程序使用了许多不同类型的对象,每个对象都有一个名称。 在许多课程开始包含之后

public String getName(){...}
public void setName(String name){...}

复制粘贴代码的方法只不过是设置方法和获取方法而已,整个房间简直无法忍受。 因此我们创建了一个类

class HasName {public String getName(){...}public void setName(String name){...}
}

每个具有名称的类都只是扩展了该类。 实际上,它很长时间没有工作。 有些班级已经扩展了其他班级。 在那种情况下,我们只是试图在继承行中将HasName向上移动,但在某些情况下,它只是行不通。 当我们到达最高峰时,我们意识到那些阶级及其后代没有名字,为什么要强迫他们? 老实说,在现实生活中,这比仅仅拥有名字要复杂得多。 如果只是名称,我们可以将其与其他具有名称的类一起使用。 事情变得更加复杂,这只会使话题变得更加复杂,并让我相信:它将变得足够复杂。

简介:我们无法实现在某些备用类中实现的某些对象的名称。 但是现在我们可以使用默认方法来做到这一点。

具有默认实现的HasName接口

默认方法仅提供默认功能。 默认方法可以访问this变量, this变量始终是实现接口的对象,并且代表该方法被调用。 如果有一个接口I和C类实现接口,当一个上的方法C c对象被调用变量this实际上是对象c 。 您将如何实现getName()setName()

这些是访问对象中的String变量的设置方法和获取方法。 您不能从界面访问它。 但是,将值存储在对象中并不是绝对必要的。 唯一的要求是,为对象设置的任何内容都将相同。 我们可以将值存储在其他位置,每个对象实例一个。 因此,我们需要一些可以与对象配对的值,并且该值的生存期必须与该对象的生存期相同。 它会响吗?

这是一个弱哈希表! 是的。 并使用它可以轻松实现HasName接口。

public interface HasName {class Extensions {private static final WeakHashMap<HasName, String> map = new WeakHashMap<>();}default void setName(String name) {Extensions.map.put(this, name);}default String getName() {return Extensions.map.get(this);}
}

您所要做的就是在该类实现的接口列表的末尾写: ,HasName ,它神奇地拥有了。

在此示例中,唯一存储的值是String 。 但是,您可以拥有任何类而不是String并且不仅可以实现setter和getter,而且可以实现对该类执行某些操作的任何方法。 大概这些实现将在类中实现,并且默认方法将仅委托。 您可以将类放置在其他位置,也可以将其作为内部类放在接口中。 品味和风格的问题

结论

接口不能具有实例字段。 为什么? 因为在那种情况下,它们不是接口而是类。 Java没有多重实现继承。 也许有,但是“请不要使用”。 默认方法是技术错误。 您可以称其为妥协。 使用功能性方法扩展时,需要一些东西来保持JDK库的向后兼容性。 您仍然可以使用弱哈希映射模拟接口中的字段,以访问要委派的字段和方法的继承类“ vtable”。 有了它,您可以进行真正的多重继承。 您的母亲经常警告您的类型。 我告诉你队友!

另一个警告:以上实现不是线程安全的。 如果尝试在多线程环境中使用它,则可能会收到ConcurrentModificationException,或者甚至可能会在弱哈希映射上调用get()进入无限循环,并且永不返回。 我不告诉您在这种情况下如何解决弱哈希映射的使用问题。 或者,好吧,我改变了主意,然后做了:只使用默认方法使用的默认方法。

翻译自: https://www.javacodegeeks.com/2014/04/how-not-to-use-java-8-default-methods.html

java8 默认方法

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

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

相关文章

【渝粤教育】国家开放大学2018年秋季 0706-22T行政管理学导论 参考试题

科目编号&#xff1a;[0709] 座位号 2018-2019学年度第一学期期末考试 初级会计实务&#xff08;一&#xff09; 试题 2019年 1 月 一、单选题&#xff08;本大题共10小题&#xff0c;每小题3分&#xff0c;共计30分&#xff09; &#xff08;★请考生务必将答案填入到下面对应…

工业以太网交换机的安装流程详解

工业以太网交换机是应用于工业控制领域的以太网交换机设备&#xff0c;所以设备的安装调试是很重要的一环&#xff0c;那么&#xff0c;我们在安装工业交换机的过程中需要注意什么呢&#xff1f;工业以太网交换机的安装流程是什么呢&#xff1f;接下来我们就跟随飞畅科技的小编…

【渝粤教育】国家开放大学2018年秋季 0734-22T出纳实务 参考试题

试卷代号&#xff1a;1021 劳动与社会保障法 试题 2019年1月 一、单项选择题&#xff08;每小题1分&#xff0c;共10分。在每小题的四个备选答案 中&#xff0c;选出一个正确的答案&#xff0c;请将正确答案的序号填在括号内&#xff09; 1&#xff0e;劳动者的劳动权利能力和…

带有Spring Security的OAuth 2.0快速指南

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 在构建Web应用程序时&#xff0c;必须进行身份验证和授权。 然而&#xff0c;正确地做…

工业以太网交换机在实际应用中的优势

相信大家对交换机应该都不陌生&#xff0c;交换机可以说应用于网络通信的各个方面&#xff0c;它极大的帮助我们提高了工作效率&#xff1b;但是一般我们会分为工业交换机和普通交换机&#xff0c;在实际应用当中&#xff0c;不同的环境和场合我们还是要有所区分的&#xff0c;…

php soap debug,php soap客户端调试实例

1&#xff0c;php soap客户端代码&#xff0c;如下&#xff1a;try {$client new SoapClient(null,array(location >http://localhost/oms07/index.php?rapi,uri >http://localhost/oms07));$results $client->__soapCall(getFailParts, array(startTime>2013-1…

【渝粤教育】国家开放大学2018年秋季 1167t环境水利学 参考试题

试卷代号&#xff1a;1189 政府经济学 试题 2019年1月 一、单项选择题&#xff08;每小题1分&#xff0c;共10分&#xff09; 1.政府经济的依据主要是( )。 A.私人财产所有权 B.社会公共权力 C.道德劝说 D.法律制度 2.公共选择的基本原理是将( )的分析方法用于非市场的政治领域…

php vimrc配置文件,vim技巧:我的 .vimrc 配置文件,详解每一个配置项的作用

下面是我的 .vimrc 配置文件&#xff0c;每一个配置项都添加了注释说明&#xff0c;详解每一个配置项的作用&#xff0c;以便确认为什么要添加这个配置项。" 使用vim的modeline来设置当前文件的textwidth,避免输入超过78个字符时自动换行" 使用:verbose set textwidt…

【渝粤教育】国家开放大学2018年秋季 1317T社会工作行政(本) 参考试题

试卷代号&#xff1a;1325 妇产科学与儿科护理学 试题 2019年1月 一、单项选择题&#xff08;每题2分&#xff0c;共50分&#xff09; 1.正常胎心率的范围是&#xff08; &#xff09;。 A. 80&#xff5e;100次&#xff0f;分 B.100&#xff5e;120次&#xff0f;分 C.120&…

检测工业级交换机性能好坏的8种方法

如今&#xff0c;工业级交换机的品牌和种类可谓是非常多&#xff0c;对于工业级交换机用户来说&#xff0c;如何选择&#xff0c;如何检测交换机的性能可以说是非常头疼的事情。其实一般检测工业级交换机的性能好坏也是有方法的&#xff0c;下面杭州飞畅科技就给大家介绍一些常…

带有Oracle Digital Assistant和Fn Project的会话式UI。 第三部分,迁移到云

在本文中&#xff0c;我将继续讲述在Oracle Digital Assistant和Oracle Digital Assistant的 基础上为FlexDeploy实现对话式UI的故事。 Fn项目 。 今天&#xff0c;我将围绕聊天机器人工作的无服务器API移到云中&#xff0c;因此整个解决方案都在云中工作&#xff1a; 该API是…

【渝粤教育】国家开放大学2018年秋季 1398T分析化学(本) 参考试题

试卷代号&#xff1a;2027 金融市场 试题 2019年1月 一、单项选择题&#xff08;每小题1分&#xff0c;共10分。每小题有一项正确答案&#xff0c;请 将正确答案的序号填写在括号内&#xff09; 1.金融市场上最重要的主体是( )。 A.政府 B.家庭 C.企业 D.机构投资者 2.( )是指那…

如何识别交换机的性能优劣?

随着网络应用的逐渐深入&#xff0c;电信级交换机&#xff0c;特别是三层交换机已经成为当今市场争夺的焦点。但是在功能各异、种类繁多的交换机设备中&#xff0c;用户要如何拨开迷雾&#xff0c;找到符合自身应用特点的产品。接下来就由杭州飞畅科技给大家讲讲如何识别交换机…

【渝粤教育】国家开放大学2018年秋季 2120T医学免疫学与微生物学 参考试题

试卷代号&#xff1a;2136 管理会计 试题 2019年1月 一、单项选择题&#xff08;每小题1分&#xff0c;共20分&#xff09; 1&#xff0e;EVA与基于利润的企业业绩评价指标的最大区别是( )。 A&#xff0e;将权益资本成本计入资本成本 B&#xff0e;不考虑权益资本成本 C&…

Jakarta EE中的规范范围

使用Eclipse Foundation Specification Process &#xff08;EFSP&#xff09;&#xff0c;一个开放源代码规范项目就有一个专门的提交者项目团队来创建和维护一个或多个规范。 创建和维护的周期跨越了该规范的多个版本&#xff0c;因此尽管各个成员可能来去去去&#xff0c;但…

kafka metric java,jmx_exporter+prometheus+grafana实现kafka metric监控

2.配置kafka的JMX PORT,修改bin/kafka-server-start.sh,添加一行export JMX_PORT"9999"&#xff0c;我这里用了9999端口。3.下载jmx_exporter,链接 https://github.com/prometheus/jmx_exporter, 我将文件放在/opt/kafka/kafka_2.11-1.0.0/jmx_prometheus_javaagent-…

【渝粤教育】国家开放大学2018年秋季 2322T物流信息技术 参考试题

试卷代号&#xff1a;2391 古代汉语(2) 试题&#xff08;开卷&#xff09; 2019年1月 一、填空&#xff08;每空1分&#xff0c;共20分&#xff09; 1&#xff0e;开我国文体研究先河的是 。他把文体分为四类&#xff0c;即____、、 、。 2&#xff0e;论辩类&#xff0c;正面阐…

【渝粤教育】国家开放大学2018年秋季 2604T城市轨道交通行车组织 参考试题

试卷代号&#xff1a;2632 城市轨道交通客运组织 试题 2019年1月 一、单项选择题&#xff08;每小题2分&#xff0c;共20分&#xff0c;将正确答案选项的字母填入题目中的括号内&#xff09; 1&#xff0e;( )是客运服务系统的行为规则。 A.安全规则 B&#xff0e;事故处理规则…

网络交换机3大常见故障问题

交换机运行中出现故障是不可避免的&#xff0c;但出现故障后应当迅速地进行处理&#xff0c;尽快查出故障点&#xff0c;排除故障。要做到这一点&#xff0c;就必须了解交换机故障的类型及具备对故障进行分析和处理的能力。一般来说&#xff0c;交换机常见的故障有电源故障、端…

php只能写入7字符,如何在PHP 7之前解决“必须是字符串的实例,字符串给定”?...

类型提示只能是对象和数组(自PHP 5.1以来)类型 . 不支持使用int和string的传统类型提示 .所以你拥有它 . 错误消息并不是真的有用&#xff0c;但我告诉你 .** 2017年编辑**有效类型类/接口名称&#xff1a;参数必须是给定类或接口名称的实例 . (自PHP 5.0.0起)self&#xff1a;…