Имитация частных интерфейсов в 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
.