Имитация частных интерфейсов в java 8

У меня проблема с имитацией общедоступных интерфейсов в java 8. Прямо сейчас у меня есть этот интерфейс с этими методами:

public interface A<T> {

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

Интерфейс A реализован классом 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(и method3, если пользователь хочет). Класс B реализуетmethod1, который содержит всю логику.

Моя проблема в том, что когда я это делаю ConcreteB.getInstance(), разработчикам доступны следующие методы: method1, method2, а также method3, и я хочу сделать видимым для разработчика только method1. Но поскольку java 8 не позволяет мне создавать частные методы для интерфейсов, я не знаю, как это сделать.

Есть какие-нибудь советы, как решить эту проблему?

Благодарность!

1 ответ

Решение

Вы не должны помещать эти "частные" методы в интерфейс. Интерфейс заставит публичный 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.

Другие вопросы по тегам