【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 {
    @Override
    public boolean isEmpty() {
        return 0 == size();
    }
}

List的一个实现类ArrayList:

package com.morris.java9;

public class ArrayList7 extends AbstractList7 {

    @Override
    public void add(Object o) {
    }

    @Override
    public Object get(int index) {
        return null;
    }

    @Override
    public 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方法的实现可以保持简洁,而验证逻辑被封装在了一个私有方法中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文件缓冲区

为什么要有文件缓冲区的存在&#xff1f; 假设甲在云南&#xff0c;甲的朋友乙在北京&#xff0c;甲想给乙送个东西就需要跑到北京去&#xff1a;这时候有菜鸟驿站了&#xff0c;甲就不用跑了&#xff0c;直接把包裹交给菜鸟驿站就可以了。缓冲区就类似于菜鸟驿站&#xff0c;…

【vscode环境配置系列】vscode远程debug配置

VSCODE debug环境配置 插件安装配置文件debug 插件安装 安装C/C, C/C Runner 配置文件 在项目下建立.vscode文件夹&#xff0c;然后分别建立c_cpp_properties.json&#xff0c; launch.json&#xff0c;tasks.json&#xff0c;内容如下&#xff1a; c_cpp_properties.json:…

Dockerfile实战(SSH、Systemctl、Nginx、Tomcat)

目录 一、构建SSH镜像 1.1 dockerfile文件内容 1.2 生成镜像 1.3 启动容器并修改root密码 二、构建Systemctl镜像 2.1 编辑dockerfile文件 ​编辑2.2 生成镜像 2.3 启动容器&#xff0c;并挂载宿主机目录挂载到容器中&#xff0c;然后进行初始化 2.4 进入容器验证 三、…

进程的概念(2)

进程优先级 1.什么的优先级 概念&#xff1a;指定进程获取某种资源&#xff08;CPU&#xff09;的先后顺序 本质&#xff1a;优先级的本质是优先级数字的大小&#xff0c;Linux中优先级数字越小&#xff0c;优先级越高 task_struct 进程控制快-> struct -> 内部字段 -&g…

《从Paxos到Zookeeper》——第四、七章:基本概念及原理

目录 第四章 Zookeeper与Paxos 4.1 Zk是什么 4.1.1 Zk特性 4.1.2 Zk基本概念 4.1.2.1 集群角色(Follower, Leader, Observer) 4.1.2.2 数据模型 4.1.2.3 ZNode(数据节点) 4.1.2.4 Session(会话) 4.1.2.5 ACL&#xff08;Access Control Lists&#xff09; 4.1.2.6 Watcher(事件…

测试开发 | 相比 Selenium,Web 自动化测试框架 Playwright 有哪些强大的优势?

Playwright 是由微软的研发团队所开发的一款 Web 自动化测试框架&#xff0c;这个框架具有多平台、跨语言的特点。除了基本的自动化测试能力之外&#xff0c;同时它还具备非常强大的录制功能、追踪功能。以下是 Playwright 与 Selenium 的对比。 ​ 由此可见&#xff0c;Play…

HTML5(2)

目录 一.列表、表格、表单 1.列表标签 2.表格 4.无语义的布局标签 5.字符实体 6.综合案例--1 7.综合案例--表单 一.列表、表格、表单 1.列表标签 1.1 无序列表 1.2 有序列表 1.3 定义列表 定义列表一般用于网页底部的帮助中心 2.表格 2.1 2.2 表格结构标签 shiftaltf 格…

chrome 安装devtools

chrome 安装devtools 下载安装 链接&#xff1a;https://github.com/vuejs/devtools 选择对应版本&#xff1a; 安装yarn 下载 npm install -g yarn --registryhttps://registry.npmmirror.com进入下载的目录安装依赖 yarn install --registryhttps://registry.npmmirror.…

简单的图像处理算法

本笔记参考crazy_Bingo 基础&#xff1a; 图像处理都是用卷积矩阵对图像卷积计算&#xff0c;如3X3 的矩阵对640 X 480分辨率的图像卷积&#xff0c;最终会得到638 X 478 的图像。卷积过程是这样的&#xff1a; 一、中值滤波 &#xff1a; 找出矩阵中的最中间值作为像素点 中…

动态增删表格

期望目标&#xff1a;实现一个能通过按钮来动态增加表格栏&#xff0c;每次能添加一行&#xff0c;每行末尾有一个删减按钮。 <el-button type"text" class"primary"click"addMember()">添加</el-button> <el-table:data"m…

数据库常考理论

1 笛卡尔积X与自然连接∞的区别 2 求候选键 3 无损连接及函数依赖 4 范式判断 笛卡尔积&#xff1a;S1*S2,产生的结果包括S1和S2的所有属性列&#xff0c;并且S1中每条记录依次和S2中所有记录 组合成一条记录&#xff0c;最终属性列为S1S2属性列&#xff0c;记录数为S1*S2记…

mamba 和conda 安装R包

**1. 下载miniconda3 ** wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh这个命令是在linux终端中输入的,miniconda3管理起来更方便。 2. 安装miniconda3 sh Miniconda3-latest-Linux-x86_64.sh接下来会有一些回车(ente…

「C++ 内存管理篇 1」C++动态内存分配

目录 〇、C语言的动态内存分配方式 一、C的动态内存分配方式 1. 什么是C的动态内存分配&#xff1f; 2. 为什么需要C的动态内存分配&#xff1f; a. new的优势 b. new的不足 c. delete的优势 d. 总结 3. 怎么使用new和delete? a. 对于内置类型 b. 对于自定义类型 c. 为什么ne…

牛客NC242 单词搜索【中等 递归DFS C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/987f2981769048abaf6180ed63266bb2 思路 递归&#xff1a;以word第一个字符为起点&#xff0c;在矩阵中 递归搜索&#xff0c;检查是否存在完整的word路径&#xff0c; 注意恢复现场&#xff0c;又叫回溯&#…

物联网通信网关的主要功能体现在哪些方面?-天拓四方

在信息化、智能化的时代&#xff0c;物联网技术的广泛应用正在逐渐改变我们的生活方式。物联网通过各种传感器和设备&#xff0c;将现实世界与数字世界紧密相连&#xff0c;从而实现智能化、自动化的生活和工作方式。作为物联网生态系统中的重要组成部分&#xff0c;物联网通信…

MySQL:飞腾2000+Centos7.6 aarch64 部署MySQL8.0.36

目录 1.硬件环境 2.MySQL选择 Bundle版本【全部文件】​编辑 3.下载并安装 4.安装完成后检查mysql 5.初始化MySQL 6.那就问了&#xff0c;都初始化了啥&#xff1f; 7.尝试启动MySQL 8.给mysql文件授权 9.再次尝试启动正常 10.mysql初始化目录出现了mysql.sock 11.找…

VS2022 配置OpenCV开发环境详细教程

OpenCV OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库&#xff0c;由Intel开发并首先发布于1999年。OpenCV被广泛用于实时图像处理、视频分析、物体检测、面部识别、机器人视觉以及许多其他领域。它支持C、Pytho…

Flutter应用开发-几种保存简单配置的方式

文章目录 简单配置保存的几种方式使用 shared_preferences 插件优点缺点 使用 hive 插件优点 缺点使用文件存储&#xff1a;优点缺点 简单配置保存的几种方式 在 Flutter 开发的 Android 应用中&#xff0c;保存应用配置并下次启动时读取&#xff0c;有以下几种比较合适的方式…

rust疑难杂症解决

rust疑难杂症解决 边碰到边记录&#xff0c;后续可能会逐步增加&#xff0c;备查 cargo build时碰到 Blocking waiting for file lock on package cache 原因是Cargo 无法获取对包缓存的文件锁&#xff0c; 有时vscode中项目比较多&#xff0c;如果其中某些库应用有问题&…

Docker | 入门:安装与配置

Docker | 入门&#xff1a;安装与配置 Docker 和传统虚拟机区别 对于传统虚拟机&#xff1a; 虚拟出一套硬件&#xff0c;运行一个完整的操作系统&#xff0c;并在这个操作系统上安装和运行软件。 对于 Docker: 将一个个容器隔离开。 容器内的应用直接运行在宿主机的内容&am…