默认方法一种扩展旧代码的方法

如您所知,Java的新版本于2014年3月18日发布,我将介绍一系列文章来演示其新功能,也许在某些方面,我将谈论我的想法和批评。

我认为重要的第一个功能是“默认方法”,在所有Java语言的先前版本中,接口只能包含方法定义(声明)而不是方法实现(方法体),但是在Java 8中,接口中增加了一个新功能,使您能够在接口中声明方法及其实现。

假设您可以使用以下新功能创建一个界面:

public interface Dog {void bark();default void bite() {System.out.println("Biting Biting Biting");}
}public class Husky implements Dog {@Overridepublic void bark() {System.out.println("barking");}public static void main(String... args){Dog dog = new Husky();dog.bite();dog.bark();}
}

这是完全自我解释的,您可以将行为添加到接口中,并且所有已实现的类都将这种行为作为方法的默认实现,因此不会被迫实现默认方法。

默认方法的原因

在之前的一篇文章中,我们对Open Close Principal进行了介绍,就像在这个Principal类中的评论应该关闭才能进行修改而可以扩展一样。 我认为默认方法并不遵循该原则,但是有些地方也许我们没有任何解决方案来扩展我们的旧代码。

例如,在Java 8中,语言中增加了一个新功能,可以在集合上使用lambda,可以使用此方法的一种方法是调用Collection接口的stream方法,如果这只是一个方法声明,则说明实现了Collection的所有书面代码会休息的。

有时候,对我来说,需要扩展我的界面,但是由于许多其他客户端正在使用界面,我不得不找到另一种解决方案,不幸的是,在大多数情况下,这是一种麻烦的方式。

有关默认方法的几点

当您要使用默认方法或要使用使用默认方法的代码时,应了解一些要点。

    • 扩展包含默认方法的接口:
      当您想使用默认方法扩展或实现接口时,关于默认方法有三种选择。
      • 您可以使用它们的默认实现,而忽略以重新定义它们。
      • 您可以重新声明它,因此它将是一种抽象方法。
      • 您可以通过重新定义它来覆盖它。
    • 使用默认方法的多重继承:使用默认方法,您可以拥有具有许多接口的mixin行为的类,但是您应该注意一个重要的点。
      如果扩展接口具有公共方法签名,则您 将面临编译时错误 ,因为同一方法签名的两个实现之间存在歧义,在这种情况下,您将需要重写方法并通过自己的代码来实现或选择默认方法之一。
public interface FirstInterface {default void doSomething(){System.out.println("Doing something from FirstInterface");}}public interface SecondInterface {default  void doSomething(){System.out.println("Doing something from SecondInterface");}
}public class FirstImplementation implements SecondInterface,FirstInterface {@Overridepublic void doSomething(){SecondInterface.super.doSomething();}public static void main(String... args){System.out.println("GGG");new FirstImplementation().doSomething();}
}

翻译自: https://www.javacodegeeks.com/2014/03/default-methods-an-approach-to-extend-legacy-code.html

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

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

相关文章

vue 如何点击按钮返回上一页

1&#xff0c;vue 如何点击按钮返回上一页呢&#xff1f; 这是vue挂载的范围html代码 <div click"goOff()">返回</div> 下面是点击返回的方法 第一种只返回上一页 goOff(){ this.$router.go(-1); }, 第二种 返回上一页&#x…

2007白领职场成功需要哪“十商”

1.德商(MQ)&#xff1a;指一个人的道德人格品质。德商的内容包括体贴、尊重、容忍、宽容、诚实、负责、平和、忠心、礼貌、幽默等各种美德。 2.智商(IQ)&#xff1a;是一种表示人智力高低的数量指标。也可以表现为一个人对知识的掌握程度&#xff0c;反映人的观察力、记忆力、思…

Remove Element - LeetCode

目录 题目链接注意点解法小结题目链接 Remove Element - LeetCode 注意点 输入的数组是无序的解法 解法一&#xff1a;使用了erase函数&#xff0c;将等于val的值移除。时间复杂度为O(n) class Solution { public:int removeElement(vector<int>& nums, int val) {fo…

DRF url控制 解析器 响应器 版本控制 分页(常规分页,偏移分页,cursor游标分页)...

url控制第二种写法&#xff08;只要继承了ViewSetMixin&#xff09; url(r^pub/$,views.Pub.as_view({get:list,post:create})), #获取所有记得路由后面加$结束符 #pub/?formatjsonurl(r^pub\.(?P<format>\w)$,views.Pub.as_view({get:list,post:create})), #pu…

要配置php环境_只需修改,要配置Apache的PHP环境,只需修改()。

案例分析一&#xff1a;假定CPU的主频是500MHz。硬盘采用DMA方式进行数据传送&#xff0c;其数据传输率为4MB/s, 每次DMA传输的数据量为8KB, 要求没有任何数据传输被错过。如果CPU在DMA初始化设置和启动硬盘操作等方面用了1000个时钟周期&#xff0c;并且在DMA传送完成后的中断…

使用Java 8和Lambda简化ReadWriteLock

考虑到旧版Java代码&#xff0c;无论您在哪里看&#xff0c;带有lambda表达式的Java 8绝对可以提高质量和可读性。 今天&#xff0c;让我们看一下ReadWriteLock以及如何使它使用起来更简单。 假设我们有一个称为Buffer的类&#xff0c;该类可以记住队列中的最后几条消息&#x…

[导入]C#好书盘点【月儿原创】

C#好书盘点【月儿原创】 文章来源:http://blog.csdn.net/21aspnet/archive/2007/07/07/1682200.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2007/07/08/816177.html

岁月如歌,人生如诗

虎跃千山龙腾海&#xff0c;春满家园喜满怀。新的一年&#xff0c;孕育着新的生命&#xff1b;新的一年&#xff0c;掸去了飞雪的扬花&#xff0c;满心的惬意告诉我们&#xff0c;所有的期盼与期望&#xff0c;一切的向往与憧憬正向着我们走近&#xff0c;向着春天融合。 ​ 新…

DOM编程以及domReady加载的几种方式

1&#xff0c;关于DOM编程 DOM编程主要是对dom树节点进行操作&#xff0c;所以你必须掌握基本的节点类型&#xff0c;如何去获取节点名字以及值&#xff08;这些相关知识你可以去网上查&#xff0c;这里推荐一个慕课学习网站->https://www.imooc.com/video/9491&#…

倒叙输出 php,php foreach正序倒序输出示例代码

实现代码&#xff1a;// 正序foreach($files as $file_num > $file) {if(is_file($directory.$file)){//$file iconv("gb2312","UTF-8",$file); //或者 iconv("gb2312","UTF-8",$value);$date substr($file,0,9);echo ;echo ;ech…

黑色系产业结构

转载于:https://www.cnblogs.com/luoluo-123/p/11143867.html

在Java 8 Lambda中创建自己的循环结构

Java没有简单的构造可以重复N次。 当然&#xff0c;我们可以创建一个for循环&#xff0c;但是很多时候我们甚至都不关心在循环中创建的变量。 我们只想重复一些代码N次&#xff0c;仅此而已。 使用Java 8中的lambda时&#xff0c;您可以尝试执行以下操作&#xff1a; public c…

Smart Form Tutorial(适用新手学习)

发现Smart Form在ECC6中和4.6C相比改变了不少&#xff0c;最近重新研究了一下。help.sap.com上的文档基本上是针对新特性的&#xff0c;不过例子却还是旧的。做个笔记省的以后找不到最新的example。最大的改变在Table上&#xff0c;现在table的header和footer比以前好做了。还是…

执行命令npm install XXX后仍然提示 Cannot find Module XXX

最近遇到一个问题&#xff0c;在服务器上配置完node环境后 执行npm start 命令后提示 Cannot find Module "Jquery" 然后就知道可能没有安装jquery 就继续在当前文件夹下执行 npm install jquery 但是再次执行后却仍然提示 Cannot find Module "Jquery"…

青蛙学Linux—Zabbix Web使用之Zabbix发现功能①自动网络发现

Zabbix的发现功能用于自动发现主机或者监控数据&#xff0c;包括以下三种发现类型&#xff1a; 自动网络发现&#xff08;Network discovery&#xff09;主动客户端自动注册&#xff08;Active agent auto-registration&#xff09;低级别发现&#xff08;low-level discovery&…

php 修改 wordpress,wordpress怎么编辑代码修改页面

wordpress是用PHP写的。PHP是服务器端执行脚本文件。然后到客户端(就是网页)生成html文件。你看到的html代码都是PHP程序在服务器端执行后生成的。若要修改代码主要是看想修改那一部分的内容。然后找到其对应的PHP代码.然后修改。在后台点击-->,就能看见你现在使用的wp主题的…

mpvue tabBar设定 app.json

1.微信小程序&#xff0c;设置src/app.json 中的tabBar 图标选择来自 iconfont 如图所示 小程序显示如下&#xff1a; 转载于:https://www.cnblogs.com/0909/p/11144861.html

JDK 8时代的抽象类与接口

在新的Java 8日期和时间API&#xff1a;Stephen Colebourne的访谈中 &#xff0c; Stephen Colebourne告诉Hartmut Schlosser &#xff1a;“我认为最重要的语言更改不是lambda&#xff0c;而是接口上的静态方法和默认方法。” Colebourne补充说&#xff1a;“添加默认方法消除…

察看linux内存使用情况

free功能说明&#xff1a;显示内存状态。语  法&#xff1a; free [-bkmotV][-s <间隔秒数>]补充说明&#xff1a;free指令会显示内存的使用情况&#xff0c;包括实体内存&#xff0c;虚拟的交换文件内存&#xff0c;共享内存区段&#xff0c;以及系统核心使用的缓冲区…

ajax请求拿到多条数据拼接显示在页面中

首先我们拿到的了一坨Json数据 如下 然后通过ajax请求拿到数据 在ajax的success方法中处理和使用数据&#xff1a; 其中包括&#xff1a; 用eval处理这种数据 var outStr eval(( data.data )); 用循环取出数据并使用 $.each(outStr,function(index){ console.log(outStr[i…