2

我在 java 8 中模拟公共接口时遇到问题。我现在有这个方法的接口:

public interface A<T> {

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

接口 A 由 class 实现B,它是一个抽象类:

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

method1包含所有逻辑,应该是开发人员可以看到/使用的逻辑。

现在,下面表示类的具体表示B

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,如果用户愿意)。B 类实现了method1,其中包含所有逻辑。

我的问题是,当我这样做时ConcreteB.getInstance(),开发人员可以使用的方法是method1method2method3,并且我只想让开发人员可以看到 method1。但是因为 java 8 不允许我在接口上创建私有方法,所以我不知道该怎么做。

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

谢谢!

4

1 回答 1

3

您不应该将那些“私有”方法放在接口中。接口将强制其公共 APIB及其所有子类向世界公开所有三种方法。这是因为接口旨在定义公共 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 ....)
    }
}

这样,您在公共 API 中只包含您想要包含在其中的方法,而其余的只对 B 及其子类可用。如果其他两个方法不应该被 的子类访问B,那么您可以将它们设为私有B

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

于 2020-03-03T12:48:14.803 回答