java中接口私有反方

引入Java 8时,我们可以在接口中使用默认方法。 此功能的主要驱动程序是允许接口扩展,同时保留对旧接口版本的向后兼容性。 一个示例是在现有Collection类中引入stream()方法。

有时候,当我们想引入几种默认方法时,它们可能共享一些通用的代码库,因此,如果我们可以在接口中使用私有方法,那就太好了。 这样,我们可以重用我们的代码,还可以防止代码暴露给正在使用或正在实现接口的类。

但有一个问题。 接口中的私有和受保护访问被推迟到Java9。那么,今天如何在Java 8中使用私有接口方法呢?

一个简单的解决方案

假设我们有两个方法Foobar()bazz()都将返回一些难以计算的结果,这些结果是从这样的共享代码中发出的:

public interface Foo {default int bar() {return complicatedMethodWithManyLinesOfCode();}default int bazz() {return complicatedMethodWithManyLinesOfCode() + 1;}// Will not work in Java 8 because interface methods cannot be private!private int complicatedMethodWithManyLinesOfCode() {// Actual code not shown...return 0;}}

通过引入一个包含私有方法的class ,我们可以从外部访问“隐藏”该方法,并几乎摆脱Java 8接口中的私有方法。 可以这样完成:

public interface Foo {default int bar() {return Hidden.complicatedMethodWithManyLinesOfCode();}default int bazz() {return Hidden.complicatedMethodWithManyLinesOfCode() + 1;}class Hidden {private static int complicatedMethodWithManyLinesOfCode() {// Actual code not shown...return 0;}}}

从外部类或接口看不到方法Foo:complicatedMethodWithManyLinesOfCode但是可以看到Hidden类本身。 但是,如果它们是私有的,则看不到“ Hidden方法和字段。

此方案也可以应用于受保护的接口方法访问。 从技术上讲,我们可以在一个接口中扩展Hidden类,该接口还可以扩展原始接口Foo 。 请记住,受保护的方法在包中也是可见的,因此,如果我们扩展或使用同一包中的接口,则受保护的方法也是可见的(与以往一样)。

一个缺点是隐藏方法无法访问接口中的其他方法。 通过使隐藏的静态方法采用接口类型的参数,可以轻松地解决后一个缺点。 假设complicatedMethodWithManyLinesOfCode方法需要Foo接口中的另一个值,该值可以通过名为buzz()某些接口方法获得,则它可能看起来像这样:

public interface Foo {default int bar() {return Hidden.complicatedMethodWithManyLinesOfCode(this);}default int bazz() {return Hidden.complicatedMethodWithManyLinesOfCode(this) + 1;}int buzz();class Hidden {private static int complicatedMethodWithManyLinesOfCode(Foo foo) {// Actual code not shown...return 0 + foo.buzz();}}}

翻译自: https://www.javacodegeeks.com/2016/03/java-8-declare-private-protected-methods-interfaces.html

java中接口私有反方

java中接口私有反方_Java 8:在接口中声明私有和受保护的方法相关推荐

  1. Java 8:声明接口中的私有方法和受保护的方法

    引入Java 8时,我们可以在接口中使用默认方法. 此功能的主要驱动程序是允许扩展接口,同时保留对旧接口版本的向后兼容性. 一个示例是在现有Collection类中引入stream()方法. 有时,当 ...

  2. java接口返回值_java后台调用接口并返回值

    import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import j ...

  3. java类接口的区别_java抽象类和接口区别

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  4. java实现导出excel表_java实现导出网页中的表格为Excel

    将网页中的table数据,导出到excel表格,可以使用java POI实现. java poi是java中操作excel的工具,支持excel的导入与导出,一般有三种形式: 1.HSSFWorkbo ...

  5. java继承和接口的优缺点_Java抽象类和接口的优缺点---总结-2

    51Testing软件测试网[P/WX?\ 解决方案二:~+j;Hw/U1{@4g0 A^9@5]p7j:Rys0既然open.close和alarm属于两个不同的概念,根据ISP原则应该把它们分别定 ...

  6. java中 会话的定义_Java Mail核心类中,( )类定义了一个基本的邮件会话。_学小易找答案...

    [单选题]下列说法不正确的一项是 [填空题]发送邮件的最后一步是使用 _____________类. [判断题]可以穿凉鞋.拖鞋和裙装进入操作区域 [判断题]ROBOGUIDE中的机械手仿真程序可以直 ...

  7. java class对象创建时机_Java面向对象编程-类的声明周期

    第十章 类的生命周期 10.1 Java虚拟机及程序的生命周期 当通过java命令运行一个Java程序时,就启动了一个Java虚拟机进程.Java虚拟机进程从启动到终止的过程,称为Java虚拟机的生命 ...

  8. 新中新二代身份证dll调用,报尝试读取或写入受保护的内存,这通常指示其他内存已损坏 这个错 ...

    新中新二代身份证dll调用问题:调用这个dll时, 到这个方法: Syn_ReadMsg(nPort, 0, ref CardMsg),就报尝试读取或写入受保护的内存.这通常指示其他内存已损坏 这个错 ...

  9. java定义私有变量_java – 为什么在类中声明变量私有?

    我会开始道歉,因为我确信这已经在其他地方回答 – 我只是找不到一个解释它的方式我明白的答案!我正在做一个MSc转换课程,还有一些基本的基础,我仍然在努力,包括这一个 – 为什么使变量私有更好. 说我有 ...

最新文章

  1. F4+2 团队项目软件设计方案
  2. Python(6)-算数运算符
  3. 正则表达式之 贪婪与非贪婪模式详解
  4. linux里面vim自动显示行号,linux中vim永久显示行号、开启语法高亮
  5. Android学习总汇
  6. ActiveMQ的用途
  7. android studio降版本,Mac下Android Studio完美从2.2.2降级到2.1.3正式版方案
  8. 用友U8自定义按钮开发
  9. c语言 16进制编辑器,十六进制编辑器(010 Editor 32位)
  10. ISL22346WFRT20Z-TK 数字电位器 4路 I²C
  11. 用户名或密码错误html,用户名或密码错误【解决办法】
  12. 股票交易日志3 12.15
  13. Facebook推出附近好友功能 可用手机查附近好友
  14. Python 实现远程监控中心
  15. vnpy 查询持仓量_vn.py 数据入库
  16. 七彩cms云转码_最新版七彩CMS 2019云转码完全开源版本 程序源码带安装教程
  17. 短视频内容创业,注定只是少数人的游戏
  18. IDEA 中如何完成Git 和SVN 版本控制的切换
  19. 固态硬盘与普通硬盘的区别
  20. 简述SpringBoot Starter原理及自定义实现

热门文章

  1. YBTOJ洛谷P4331:数字序列(左偏树)
  2. 数学基础知识(高精、快速幂、龟速乘……)
  3. 【图论】【最短路】【Dijkstra】最小花费(ssl 2206/luogu 1576)
  4. 21、java中的反射机制
  5. 十分钟快速了解 ES6 Promise
  6. Java命令学习系列(四)——jstat
  7. 【Servlet】获取并输出服务器获得的数据
  8. 指纹识别软件安装包下载
  9. 调用反射类的指定方法
  10. 并查集判断是否有环存在