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

news2024/11/28 4:47:28

在这里插入图片描述

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

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

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

相关文章

PyVista 3D数据可视化 Python 库 简介

Pyvista是一个用于科学可视化和分析的Python库 &#xff1b;我认为它适合做一些网格数据的处理&#xff1b; 它封装了VTK&#xff08;Visualization Toolkit&#xff09;之上&#xff0c;提供了一些高级接口&#xff0c; 3D数据可视化变得更加简单和易用。 1.安装 pyvista&…

嵌入式软件学习--linux(1)

一.文件系统 二.shell &#xff08;从环境变量中&#xff09;解析输入指令找到&#xff08;bin中&#xff09;对应命令。 三 ./执行是因为需要知道执行文件的路径&#xff0c; 同样可以使用绝对路径运行。 echo $PATH 查看环境变量 。若在&#xff0c;可执行 &#x…

Pycharm:常用插件安装和使用

简介&#xff1a;好用的插件可以美化界面或者提升效率&#xff0c;使工作事半功倍。 推荐插件&#xff1a; 1、CSV插件&#xff1a;美化csv数据展示 2、Translation&#xff1a;翻译的插件&#xff0c;可以进行中英互译 3、CodeGlance&#xff1a;代码小地图 4、Markdown …

GQA分组注意力机制

一、目录 定义demo 二、实现 定义 grouped query attention&#xff08;GQA&#xff09; 1 GQA 原理与优点&#xff1a;将query 进行分组&#xff0c;每组query 参数共享一份key,value, 从而使key, value 矩阵变小。 2. 优点&#xff1a; 降低内存读取模型权重的时间开销&am…

Llama 3 安装使用方法

Llama3简介&#xff1a; llama3是一种自回归语言模型&#xff0c;采用了transformer架构&#xff0c;目前开源了8b和70b参数的预训练和指令微调模型&#xff0c;400b正在训练中&#xff0c;性能非常强悍&#xff0c;并且在15万亿个标记的公开数据进行了预训练&#xff0c;比ll…

Java设计模式 _结构型模式_桥接模式

一、桥接模式 1、桥接模式 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式。用于把一个类中多个维度的抽象化与实现化解耦&#xff0c;使得二者可以独立变化。 2、实现思路 使用桥接模式&#xff0c;一定要找到这个类中两个变化的维度&#xff1a;如支…

什么是中间件?中间件有哪些?

什么是中间件&#xff1f; 中间件&#xff08;Middleware&#xff09;是指在客户端和服务器之间的一层软件组件&#xff0c;用于处理请求和响应的过程。 中间件是指介于两个不同系统之间的软件组件&#xff0c;它可以在两个系统之间传递、处理、转换数据&#xff0c;以达到协…

[论文笔记]GAUSSIAN ERROR LINEAR UNITS (GELUS)

引言 今天来看一下GELU的原始论文。 作者提出了GELU(Gaussian Error Linear Unit,高斯误差线性单元)非线性激活函数&#xff1a; GELU x Φ ( x ) \text{GELU} x\Phi(x) GELUxΦ(x)&#xff0c;其中 Φ ( x ) \Phi(x) Φ(x)​是标准高斯累积分布函数。与ReLU激活函数通过输入…

Spring Web MVC入门(3)——响应

目录 一、返回静态页面 RestController 和 Controller之间的关联和区别 二、返回数据ResponseBody ResponseBody作用在类和方法的情况 三、返回HTML代码片段 响应中的Content-Type常见的取值&#xff1a; 四、返回JSON 五、设置状态码 六、设置Header 1、设置Content…

docker如何生成springboot镜像

1、在springboot的jar包所在的目录下创建Dockerfile文件&#xff0c;此案例的目录为/usr/java Dockerfile的文件内容如下&#xff1a; FROM openjdk:8 LABEL author"zengyanhui" LABEL email"1181159889qq.com" WORKDIR /usr/java/springbootdemo COPY s…

动漫渐显引导页HTML5单页源码

挺不错的动漫渐显引导页&#xff0c;记事本右键打开即可修改~ 动漫渐显引导页HTML5单页源码

重生之我是Nginx服务专家

nginx服务访问页面白色 问题描述 访问一个域名服务返回页面空白&#xff0c;非响应404。报错如下图。 排查问题 域名解析正常&#xff0c;网络通讯正常&#xff0c;绕过解析地址访问源站IP地址端口访问正常&#xff0c;nginx无异常报错。 在打开文件时&#xff0c;发现无法…

179. 最大数(LeetCode)

文章目录 前言一、题目讲解二、算法原理三、代码编写1.仿函数写法2.lambda表达式 四、验证五.总结 前言 在本篇文章中&#xff0c;我们将会带着大家采用贪心的方法解决LeetCode中最大数这道问题&#xff01;&#xff01;&#xff01; 一、题目讲解 一组非负整数&#xff0c;包…

机器学习的指标评价

之前在学校的小发明制作中&#xff0c;在终期答辩的时候&#xff0c;虽然整个项目的流程都答的很流畅。 在老师提问的过程中&#xff0c;当老师问我recall,precision,accuracy等指标是如何计算的&#xff0c;又能够表示模型的哪方面指标做得好。我听到这个问题的时候&#xff…

信息系统项目管理师0076:应用集成(5信息系统工程—5.3系统集成—5.3.5应用集成)

点击查看专栏目录 文章目录 5.3.5应用集成5.3.5应用集成 随着网络和互联网的发展以及分布式系统的日益流行,大量异构网络及各计算机厂商推出的软、硬件产品分布在分布式系统的各层次(如硬件平台、操作系统、网络协议、计算机应用),乃至不同的网络体系结构上都广泛存在着互操…

10.通用定时器

驱动电机 RGB LED亮度&#xff08;呼吸灯&#xff09; 舵机&#xff08;遥控车、机械臂&#xff09; 通用定时器作用 1.延时 2.定时器更新中断 3.输出比较&#xff08;PWM波、驱动IO输出波形&#xff08;脉冲&#xff09;&#xff09; 4.输入捕获&…

VMware安装ubuntun虚拟机使用桥接模式无法上网问题解决

问题&#xff1a;最近准备使用VMware虚拟机搭建k8s集群服务&#xff0c;因为需要在同一个网段下&#xff0c;我使用桥接的方式&#xff0c;我发现主机在使用有线连接时虚拟机网络连接正常&#xff0c;但是使用无线网就显示连接不上网络。 解决方法 一、查看网络连接&#xff…

Codeforces Round 941 (Div. 2)(A-D)

A. Card Exchange&#xff08;思维 Problem - A - Codeforces 题目大意&#xff1a; 给定n张牌&#xff0c;每次选k张相同的牌&#xff0c;把他们变成k-1张任意的牌&#xff0c;求最后手中最少能有几张牌。 思路&#xff1a; 直接判断这n张牌当中有没有k张一样的牌&#xff0c…

Python快速入门1数据类型(需要具有编程基础)

数据类型&#xff1a; Python 3.0版本中常见的数据类型有六种&#xff1a; 不可变数据类型可变数据类型Number&#xff08;数字&#xff09;List&#xff08;列表&#xff09;String&#xff08;字符串&#xff09;Dictionary&#xff08;字典&#xff09;Tuple&#xff08;元…

NLP transformers - 文本分类

Text classification 文章目录 Text classification加载 IMDb 数据集Preprocess 预处理EvaluateTrainInference 本文翻译自&#xff1a;Text classification https://huggingface.co/docs/transformers/tasks/sequence_classification notebook : https://colab.research.googl…