在Java8中模拟私有接口
我有一个关于Java8中公共接口模拟的问题。 我现在有这个与这个方法的接口:在Java8中模拟私有接口,java,java-8,interface,interface-segregation-principle,Java,Java 8,Interface,Interface Segregation Principle,我有一个关于Java8中公共接口模拟的问题。 我现在有这个与这个方法的接口: public interface A<T> { void method1(T t) throws someException; void method2(T t) throws someException; default method3() { return Collections.emptyMap(); } } method1包含所有逻辑,应该是开发人
public interface A<T> {
void method1(T t) throws someException;
void method2(T t) throws someException;
default method3() {
return Collections.emptyMap();
}
}
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扩展了B{
私有静态ConcreteB concreteBinInstance=null;
私人楼宇{
}
publicstaticconcretebgetinstance(){
if(concreteBinInstance==null){
ConcreteBinInstance=新的ConcreteB();
}
返回实例;
}
@凌驾
公共void方法2(someObject someObject)引发someException{
//(…代码…)
}
}
总之,B的具体实现实现了方法2
(如果用户愿意,还实现了方法3)。类B实现了包含所有逻辑的方法1
我这里的问题是,当我执行concrete b.getInstance()
时,可供开发人员使用的方法是method1
、method2
和method3
,我只想让方法1对开发人员可见。但是因为Java8不允许我在接口上创建私有方法,所以我不知道怎么做
如何解决这个问题有什么建议吗
谢谢 您不应该将那些“私有”方法放在接口中。接口将迫使B
的公共API及其所有子类向世界公开这三种方法。这是因为接口设计用于定义公共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 ....)
}
}
公共接口A{
void方法1(T)抛出一些异常;
}
公共抽象类B实现了{
受保护的抽象void方法2(T)抛出一些异常;
受保护的方法3(){
return Collections.emptyMap();
}
@凌驾
public void method1(T类型)引发了一些异常{
(…一些代码狙击手…)
}
}
这样,在公共API中只包含要包含的方法,其余的方法只对B及其子类可用。如果B
的子类不能访问其他两个方法,则可以在B
中将它们设为私有
此外,如果您想防止
B
的子类重写method1
,您可以将其声明为final
,当没有人应该调用它们时,将method2
和method3
放入接口有什么意义?
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 ....)
}
}