在 java 8 中模拟私有接口

Simulate private interfaces in java 8

我遇到了关于 java 8 中 public 界面模拟的问题。 我现在有这个方法的接口:

public interface A<T> {

    void method1(T t) throws someException;
    void method2(T t) throws someException;
    default method3() {
        return Collections.emptyMap();
    }
}

接口A由classB实现,是一个抽象class:

public abstract class B<T> implements A<T> {
    @Override
    public void method1(T type) throws someException {
        // (.... some code snipets ....)
    }
}

method1 包含所有逻辑,应该是开发人员可以see/use。

下面是classB的具体表示:

public final class ConcreteB extends B<someObject> {

    private static ConcreteB concreteBInstance = null;
    private ConcreteB() {
    }

    public static ConcreteB getInstance() {
        if (concreteBInstance == null) {
            concreteBInstance = new ConcreteB();
        }
        return concreteBInstance;
    }

    @Override
    public void method2(someObject someObject) throws someException {
        //  (... code ...)
     }
}

因此,总而言之,B 的具体实现实现了 method2(以及方法 3,如果用户愿意的话)。 class B 实现了 method1,其中包含所有逻辑。

我的问题是,当我执行 ConcreteB.getInstance() 时,可供开发人员使用的方法是 method1method2method3,我想让开发人员只有方法 1 可见。但是因为 java 8 没有让我在接口上创建私有方法,所以我不知道该怎么做。

关于如何解决此问题的任何提示?

谢谢!

您不应该将那些 "private" 方法放在界面中。接口将强制 B 的 public API 及其所有子 类 向世界公开所有三种方法。那是因为接口被设计用来定义一个 public API.

在这种情况下,您可以将所有方法从接口移至 B,除了 method1:

public interface A <T> {
    void method1(T t) throws someException;
}

public abstract class B<T> implements A<T> {

    protected abstract void method2(T t) throws someException;
    protected method3() {
        return Collections.emptyMap();
    }

    @Override
    public void method1(T type) throws someException {
        (.... some code snipets ....)
    }
}

这样,您在 public API 中只包含您打算包含在其中的方法,而其余的只对 B 及其子 类 可用。如果 B 的 sub类 不能访问其他两个方法,那么您可以在 B.

中将它们设为私有

此外,如果您想防止 B 的子 类 覆盖 method1,您可以将其声明为 final