Java 接口中的私有方法

Java 接口中的私有方法,用户希望将私有方法添加到接口中,这些方法可以被接口中的其他方法调用。Java 9 目前支持在接口方法中使用 private 关键字。从 Java 8 开始,开发人员可以为接口编写方法实现,并将它们标记为 defaultstatic。接下来,将 private 方法添加到接口是顺理成章的事情。

Java 接口中的私有方法 问题描述

用户希望将私有方法添加到接口中,这些方法可以被接口中的其他方法调用。

Java 接口中的私有方法 解决方案

Java 9 目前支持在接口方法中使用 private 关键字。

Java 接口中的私有方法 具体实例

从 Java 8 开始,开发人员可以为接口编写方法实现,并将它们标记为 defaultstatic。接下来,将 private 方法添加到接口是顺理成章的事情。
私有方法使用关键字 private,且必须有一个实现。与类中的私有方法相似,无法重写接口中的私有方法。更重要的是,私有方法只能从同一个源文件中调用。
例 10-8 虽然略显刻意,但仍有一定说服力。

例 10-8 接口中的私有方法

import java.util.function.IntPredicate;
import java.util.stream.IntStream;

public interface SumNumbers {
    default int addEvens(int... nums) {
        return add(n -> n % 2 == 0, nums);
    }

    default int addOdds(int... nums) {
        return add(n -> n % 2 != 0, nums);
    }

    private int add(IntPredicate predicate, int... nums) {    ➊
        return IntStream.of(nums)
                .filter(predicate)
                .sum();
    }
}

➊ 私有方法
由于接口中的默认访问是公共的,addEvensaddOdds 方法都属于 public,它们传入整数的可变参数列表作为参数。两种方法的 default 实现被委托给 add 方法。除整数的可变参数列表外,add 方法还传入 IntPredicate 作为参数。任何客户端都无法访问被声明为私有方法的 add 方法,即便通过实现 SumNumbers 接口的类也是如此。
例 10-9 显示了私有方法在接口中的应用。

例 10-9 测试接口中的私有方法

class PrivateDemo implements SumNumbers {} ➊

import org.junit.Test;
import static org.junit.Assert.*;

public class SumNumbersTest {
    private SumNumbers demo = new PrivateDemo();

    @Test
    public void addEvens() throws Exception {
        assertEquals(2 + 4 + 6, demo.addEvens(1, 2, 3, 4, 5, 6)); ➋
    }

    @Test
    public void addOdds() throws Exception {
        assertEquals(1 + 3 + 5, demo.addOdds(1, 2, 3, 4, 5, 6));  ➋
    }
}

❶ 实现 SumNumbers 接口的类
❷ 调用委托给私有方法的公共方法
由于只能实例化一个类,程序创建了一个实现 SumNumbers 接口的空类。这个名为 PrivateDemo 的类被实例化,其公共接口方法可以被调用。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程