Имитация частных интерфейсов в java 8 - PullRequest
2 голосов
/ 03 марта 2020

У меня проблема с симуляцией интерфейсов publi c в 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 содержит все логи c и должен быть тем, который разработчик может видеть / использовать.

Теперь Ниже представлено конкретное представление класса 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, который содержит все логи c.

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

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

Спасибо !

1 Ответ

3 голосов
/ 03 марта 2020

Вы не должны помещать эти "приватные" методы в интерфейс. Интерфейс вынудит API publi c из B и все его подклассы выставить все три метода миру. Это связано с тем, что интерфейсы предназначены для определения публикуемого c 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 publi c только те методы, которые вы хотите включить в него, и оставляете остальное доступным только для B и его подклассов. Если два других метода не должны быть доступны для подклассов B, то вы можете сделать их закрытыми в B.

Кроме того, если вы хотите предотвратить переопределение подклассов B method1, вы можете объявить его как final.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...