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

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中接口私有反方

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值