【java9】java9新特性之接口的私有方法

在这里插入图片描述

在Java 9中,接口可以包含私有方法(包括静态私有方法和实例私有方法)。这允许接口的设计者创建一些辅助方法,这些方法只能被接口中的其他方法所使用,而不能被实现该接口的类直接访问。

Java7

Java7及之前 ,接口中只允许两种类型的变量与方法:

  1. 常量
  2. 抽象方法

我们来看看一个示例,有个List接口:

package com.morris.java9;public interface List7 {String author = "morris";void add(Object o);Object get(int index);int size();boolean isEmpty();
}

由于List有很多实现类,比如ArrayList、LinkedList,所以我们使用一个抽象类来实现这些实现类的公共逻辑:

package com.morris.java9;public abstract class AbstractList7 implements List7 {@Overridepublic boolean isEmpty() {return 0 == size();}
}

List的一个实现类ArrayList:

package com.morris.java9;public class ArrayList7 extends AbstractList7 {@Overridepublic void add(Object o) {}@Overridepublic Object get(int index) {return null;}@Overridepublic int size() {return 0;}
}

可以看到Java7中接口是非常简单的,接口中声明的变量都是public的常量,不需要显示指定public关键字。接口中的方法都是public abstract,不需要显示的指定public abstract关键字。

Java8

Java8中对接口作出了一些改变,接口中可以具有以下类型的变量和方法

  1. 常量
  2. 抽象方法
  3. 默认方法
  4. 静态方法

我们将上面的范例改改,使用Java8的特性:

package com.morris.java9;public interface List8 {String author = "morris";void add(Object o);Object get(int index);int size();default boolean isEmpty() {return 0 == size();}
}

因为Java8的接口中的方法可以有默认实现,也就是使用default关键字修饰的方法,可以将AbstractList7中各个实现类的公共逻辑迁移到接口中,这样AbstractList7这种抽象类就可以不用存在了。

另外在接口中如果加了一个方法,所有的实现类都需要实现这个方法,而有了默认方法之后,接口的所有实现类可以有选择的重写这个默认方法。

所以,类实现某个接口就比较简单了,可以有选择性的实现部分方法。

Java8中的接口可以添加静态方法,这样就可以把接口当成工具类来实现,不需要像以前一样创建一个工具类,然后将工具栏的构造方法设置为私有的。

集合工具类以前的写法:

package com.morris.java9;import java.util.Collection;
import java.util.Objects;public class CollUtil7 {private CollUtil7() {}public static boolean isEmpty(Collection<Object> list) {return Objects.isNull(list) || list.isEmpty();}}

使用接口的静态方法实现工具类:

package com.morris.java9;import java.util.Collection;
import java.util.Objects;public interface CollUtil8 {static boolean isEmpty(Collection<Object> list) {return Objects.isNull(list) || list.isEmpty();}}

Java9

Java9中的接口,可以具有以下类型的变量和方法:

  1. 常量
  2. 抽象方法
  3. 默认方法
  4. 静态方法
  5. 私有静态方法
  6. 私有方法

在Java9中,接口可以包含私有方法(包括静态私有方法和实例私有方法)。这允许接口的设计者创建一些辅助方法,这些方法只能被接口中的其他方法所使用,而不能被实现该接口的类直接访问。

私有方法可以是静态的,也可以是非静态的(即实例方法)。

静态私有方法:这些方法只与接口本身关联,而不是与接口的任何特定实例关联。它们通常用于辅助实现接口中的默认方法或静态方法。

public interface MyInterface {  static void staticMethod() {  // ...  staticPrivateMethod();  }  private static void staticPrivateMethod() {  // 这是一个私有静态方法  }  
}

实例私有方法:这些方法与接口的实例关联,并可以用于实现接口中的默认方法。它们不能直接在实现该接口的类的实例上调用。

public interface MyInterface {  default void defaultMethod() {  // ...  instancePrivateMethod();  }  private void instancePrivateMethod() {  // 这是一个私有实例方法  }  
}

使用私有方法的主要好处是,它们可以帮助组织代码,隐藏实现细节,并防止其他类直接访问这些方法。这有助于保持接口的简洁性,同时允许在接口内部实现更复杂的逻辑。

需要注意的是,尽管接口可以有私有方法,但它们仍然不能有任何状态(即实例字段)。接口仍然只能定义行为(即方法),而不能定义状态。

以下是私有方法在接口中的一些使用场景:

  • 代码复用和封装:如果一个接口中有多个默认方法或静态方法需要执行相同的逻辑片段,你可以将这些重复的代码提取到一个私有方法中。这样,当需要修改或扩展这部分逻辑时,只需在一个地方进行修改,而不是多个地方。

  • 实现逻辑细节隐藏:通过将一些实现细节封装在私有方法中,你可以保护这些逻辑不被接口的使用者直接访问或调用。这有助于保持接口的公共API的清晰和简洁,同时允许在接口内部实现更复杂的逻辑。

  • 辅助方法:有时候,实现一个默认方法可能需要多个步骤或多个辅助函数。这些辅助函数可以作为私有方法定义在接口中,而不是将它们作为公共方法暴露给接口的使用者。

  • 静态辅助方法:私有静态方法可以在接口中用于辅助实现其他静态方法。这些方法通常用于计算或转换值,而不涉及任何与接口实例相关的状态。

  • 避免与实现类的方法冲突:如果接口中的公共方法可能会与实现类中的方法名称冲突,使用私有方法可以避免这种冲突。实现类可以自由地实现或覆盖与接口中的私有方法同名的方法,而不会与接口中的方法产生混淆。

下面是一个示例,演示了如何在接口中使用私有方法:

public interface Calculator {  int add(int a, int b);  int subtract(int a, int b);  default int multiply(int a, int b) {  return a * b;  }  default int divide(int a, int b) {  if (b == 0) {  throw new IllegalArgumentException("Divisor cannot be zero");  }  return a / b;  }  // 私有方法用于检查输入参数是否有效  private static boolean isValidInput(int a, int b) {  return a >= 0 && b >= 0;  }  // 另一个默认方法,使用私有辅助方法  default int safeAdd(int a, int b) {  if (!isValidInput(a, b)) {  throw new IllegalArgumentException("Input values must be non-negative");  }  return add(a, b);  }  
}

在这个示例中,isValidInput是一个私有静态方法,用于检查输入参数是否有效。safeAdd是一个默认方法,它使用 isValidInput方法来验证输入,并在必要时抛出异常。这样,safeAdd方法的实现可以保持简洁,而验证逻辑被封装在了一个私有方法中。

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

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

相关文章

软件项目管理的主要内容是什么?

目录 一、项目需求分析 二、项目计划制定 三、资源分配与调度 四、进度监控与控制 五、质量管理与保障 六、风险管理与应对 七、沟通协调与团队管理 八、项目收尾与总结 九、其他 一、项目需求分析 项目需求分析是软件项目管理的起始点&#xff0c;它涉及与客户的深入沟…

ubuntu22.04 修改内核源码教程

1. 确认当前内核版本 uname -a 2. 去ubuntu官网下载对应版本内核源码 6.5.0-28.29 : linux package : Ubuntu (launchpad.net) 3. 准备编译环境 sudo apt-get install libncurses5-dev libssl-dev build-essential openssl flex bison libelf-dev tar -xzvf linux_6.5.…

Spring Boot整合Redisson的两种方式

项目场景 Spring Boot整合Redisson的两种方式&#xff0c;方式一直接使用yml配置&#xff0c;方式二创建RedissonConfig配置类。 前言 redisson和redis区别&#xff1a; Redis是一个开源的内存数据库&#xff0c;支持多种数据类型&#xff0c;如字符串、哈希、列表、集合和有序…

Spring快速入门!(超详细)——工厂模式

GOF之工厂模式 设计模式&#xff1a;一种可以被重复利用的解决方案。GoF&#xff08;Gang of Four&#xff09;&#xff0c;中文名——四人组。《Design Patterns: Elements of Reusable Object-Oriented Software》&#xff08;即《设计模式》一书&#xff09;&#xff0c;19…

【网络安全】00后程序员,找 Bug 赚了 6,700,000元!他是怎么做到的?

1. 漏洞赏金计划&#xff08;Bug Bounty Programs&#xff09; 2. 安全咨询服务 3. 安全培训和教育 4. 写作和发表研究 5. 参与安全竞赛&#xff08;CTFs&#xff09; 6. 开发和销售安全工具 在网络安全领域&#xff0c;通过合法的方式利用漏洞赚钱主要涉及以下几种方法。…

【七十二】【算法分析与设计】64. 最小路径和,79. 单词搜索,1143. 最长公共子序列,利用记忆化递归填写dp表,可以很容易解决边界和填表顺序

递归填写dp表 利用递归函数填写dp表,可以很容易完成边界的处理,并且不用考虑填表的顺序. 绝大部分的动态规划可以用递归填表. 不用考虑填表顺序,只需要遍历一遍dfs即可. 64. 最小路径和 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路…

网络安全工程师必备的6个渗透测试工具

渗透测试是模拟黑客攻击&#xff0c;评估系统安全性的重要方法。 网络安全工程师需要掌握各种渗透测试工具&#xff0c;才能有效地发现和修复漏洞。 1. Nmap 功能: 强大的网络扫描器&#xff0c;可以扫描网络拓扑、识别主机和服务、发现开放端口和漏洞。 用途: 信息收集、漏洞…

Ubuntu编译安装MariaDB并进行初始化配置

Ubuntu编译安装MariaDB并进行初始化配置 1. 编译安装MariaDB2. 配置MariaDB3. Docker安装MariaDB 1. 编译安装MariaDB MariaDB官方安装文档&#xff1a;https://mariadb.com/kb/en/Build_Environment_Setup_for_Linux/    下载MariaDB源码&#xff1a;https://mariadb.org/ma…

Springboot + MySQL + html 实现文件的上传、存储、下载、删除

实现步骤及效果呈现如下&#xff1a; 1.创建数据库表&#xff1a; 表名&#xff1a;file_test 存储后的数据&#xff1a; 2.创建数据库表对应映射的实体类&#xff1a; import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.Table…

MySQL使用Sequence创建唯一主键

目录 第一章、快速了解Sequence1.1&#xff09;是什么&#xff1f;为什么使用1.2&#xff09;Sequence和自增主键的区别 第二章、在MySQL中使用Sequence2.1&#xff09;创建mysql_sequence表2.1.1&#xff09;创建表2.1.2&#xff09;插入数据 2.2&#xff09;创建函数2.2.1&am…

vue使用debugger调试代码

1.在vue.config.js中 在你的vue文件vue.config.js中找到如下configureWebpack位置&#xff0c;加入devtool:"source map"&#xff0c;重新启动项目debugger即可生效。

分享:9.3版本无缝导入AVEVA PDMS高版本工程12.0,12.1,E3D

9.3版本可以无缝导入AVEVA PDMS的工程。 UKP3d导入AVEVA PDMS工程的方法 http://47.94.91.234/forum.php?modviewthread&tid163583&fromuid6 (出处: 优易软件-工厂设计软件专家) &#xff08;从AVEVA PDMS导出时元件和等级的功能我们正做收尾工作&#xff0c;到时可以…

如何进行制造设备数据汇集,发挥数据的价值?

数字化转型正深刻推动制造企业实现远程监控、提高生产效率、降低生产成本、优化产品质量及明晰精细化方向。并且工业互联网的发展离不开工业数据的应用&#xff0c;而制造设备数据汇集正是应用的基础。但制造设备数据汇集存在以下难点及痛点&#xff1a; 1、安全把控难 关键的…

Mysql基础(一)DDL、DML、DQL、DCL 扫盲之DDL语句

一 扫盲 SQL语句根据其功能主要分为四类&#xff1a;DDL、DML、DQL、DCL说明&#xff1a; 本篇章只会粗略的分类,不会展开细节讲解 1、DDL&#xff08;Data Definition Language&#xff09;说明&#xff1a; 是一组用于定义和管理数据库结构的语句2、DML&#xff08;Data Ma…

RLDP协议原理与应用

RLDP概述 l RLDP全称是Rapid Link Detection Protocol&#xff08;快速链路检测协议&#xff09;&#xff0c;是锐捷网络自主开发的&#xff0c;用于快速检测以太网链路故障的链路协议。 l 一般的以太网链路检测机制都只是利用物理连接的状态&#xff0c;通过物理层的自动协…

张大哥笔记:我付钱了,我就是大爷?

很抱歉用这个当做标题&#xff0c;来给大家分享一些电商的故事&#xff01;大家好&#xff0c;我是张大哥&#xff0c;今天聊聊在电商路上遇到过的奇葩买家&#xff1f; 比如最近我在做PDD的时候&#xff0c;就会遇到很多莫名其妙的sha子&#xff0c;咱是知识份子&#xff0c;肯…

远程桌面连接不上个别服务器的问题分析与解决方案

在日常的IT运维工作中&#xff0c;远程桌面连接&#xff08;RDP&#xff0c;Remote Desktop Protocol&#xff09;是我们经常使用的工具之一&#xff0c;用于管理和维护远程服务器。然而&#xff0c;有时我们可能会遇到无法连接到个别服务器的情况。针对这一问题&#xff0c;我…

微信小程序4~6章总结

目录 第四章 页面组件总结 4.1 组件的定义及属性 4.2 容器视图组件 4.2.1 view 4.2.2 scroll-view 4.2.3 swiper 4.3 基础内容组件 4.3.1 icon ​编辑 4.3.2 text 4.3.3 progress ​编辑 4.4 表单组件 4.4.1 button 4.4.2 radio 4.4.3 checkbox 4.4.4 switch …

C语言--贪吃蛇小游戏

目录 一、Win32API介绍 1.1Win32API 1.2控制台程序 1.3控制台屏幕上的坐标COORD 1.4GetStdHandle 1.5GetConsoleCursorInfo 1.6 CONSOLE_CURSOR_INFO 1.7 SetConsoleCursorInfo 1.8SetConsoleCursorPosition 1.9GetAsyncKeyState 二、贪吃蛇游戏设计与分析 2.1地图 …

网站内容下载软件有哪些 网站内容下载软件推荐 网站内容下载软件安全吗 idm是啥软件 idm网络下载免费

一招搞定网页内容下载&#xff0c;并且各大网站通用&#xff01;绕过资源审查&#xff0c;所有网站内容随意下载。解锁速度限制&#xff0c;下载即高速无视网站限速。跳过会员充值&#xff0c;所有VIP资源免费下载。有关网站内容下载软件有哪些&#xff0c;网站内容下载软件推荐…