Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java8中模拟私有接口_Java_Java 8_Interface_Interface Segregation Principle - Fatal编程技术网

在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包含所有逻辑,应该是开发人

我有一个关于Java8中公共接口模拟的问题。 我现在有这个与这个方法的接口:

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 ....)
    }
}