在 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()
时,可供开发人员使用的方法是 method1
、method2
和 method3
,我想让开发人员只有方法 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
。
我遇到了关于 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()
时,可供开发人员使用的方法是 method1
、method2
和 method3
,我想让开发人员只有方法 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
。