Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.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
Java API和实现之间应该完全分离吗?_Java_Api_Implementation_Isolation - Fatal编程技术网

Java API和实现之间应该完全分离吗?

Java API和实现之间应该完全分离吗?,java,api,implementation,isolation,Java,Api,Implementation,Isolation,在大型软件实现中,通常建议将API设计与其实现分离。但在某些地方,它们必须重新连接(即,实现必须重新连接到API) 以下示例显示了API设计及其通过实例对象的实现调用: import java.util.List; public abstract class Separation { public static final Separation INSTANCE = new SeparationImpl(); // Defining a special list p

在大型软件实现中,通常建议将API设计与其实现分离。但在某些地方,它们必须重新连接(即,实现必须重新连接到API)

以下示例显示了API设计及其通过实例对象的实现调用:

import java.util.List;

public abstract class Separation {

    public static final Separation INSTANCE = new SeparationImpl();

    // Defining a special list
    public static interface MySpecialList<T> extends List<T> {
        void specialAdd(T item);
    }

    // Creation of a special list
    public abstract <T> MySpecialList<T> newSpecialList(Class<T> c);

    // Merging of a special list
    public abstract <T> MySpecialList<? extends T> specialMerge(
        MySpecialList<? super T> a, MySpecialList<? super T> b);

    // Implementation of separation
    public static class SeparationImpl extends Separation {

        @Override
        public <T> MySpecialList<T> newSpecialList(Class<T> c) {
            return ...;
        }

        @Override
        public <T> MySpecialList<? extends T> specialMerge(
            MySpecialList<? super T> a, MySpecialList<? super T> b) {
            return ...;
        }

    }

}
import java.util.List;
公共抽象类分离{
public static final Separation INSTANCE=new SeparationImpl();
//确定特别名单
公共静态接口MySpecialList扩展列表{
无效专用ladd(T项);
}
//创建特别名单
公共摘要MySpecialList newSpecialList(c类);
//合并特别名单

公共抽象MySpecialListOSGi中经常使用的一种技术是将API放在实现的单独模块中。API应该自己编译,避免直接引用实现。

我一直理解将接口与实现分离的要求,这意味着不要混合使用方法所以在上面的例子中,混合api和实现意味着在api中公开一些特定于SeparationImpl如何实现api的内容

例如,看看迭代是如何在各种集合类中实现的。有更多具体的方法可以检索特定集合中的元素(例如,通过ArrayList中的位置),但这些方法不会在
集合中公开,因为它们特定于具体ArrayList的实现方式


我也看到过有大量接口目录的项目,每个都有一个具体的实现,每个都机械地复制了具体实现中的每个方法,这似乎是一个完全没有意义的“假装”抽象,因为它实际上并没有提供任何逻辑抽象。

彼得和史蒂夫的答案已经足够了,但我想补充更多——如果你曾经只有接口或抽象类的单一实现,那么将接口或抽象类作为它的目标是毫无意义的。
在你的例子中,我真的不明白-为什么你把
Separation
实现为一个抽象类,而
SeparationImpl
本身可以是API类,或者如果你有不同的实现
Separation
可以是一个inetrface,如果你有一些常见的功能,那么你可以有另一个抽象类来实现它然后从该抽象类继承
SeparationImpl

interface Separation --> AbstractSeparation --> SeparationImpl 
就像标准收藏库一样

interface List --> AbstractList --> ArrayList

除了其他作者的优点之外,我还要提到单元测试的目的:


当使用接口而不是类时,模拟对象非常容易。

即使只有一个生产实现,ABC和接口通常仍然是一件好事;首先,它们实现了清晰的关注点分离。其次,它们允许通过模拟进行简单的单元测试。我试图说明这样一个事实:有时,您需要访问API的实例化,一种方法是从API本身提供它。我同意,这只能通过接口来完成。@Oli Charlesworth-我们可以模拟具体的类,至少不需要为了模拟的目的而有接口。@Premraj如何保证模拟的API与实现的API匹配?使用接口t他的方法很简单。mock本身就是一个简单的、精简的实现,所以通过mock,你就有了第二个实现。这是OSGi的绝对必要,还是仅仅是良好的实践?使用一些像iPOJO这样的框架是必要的,但你不必在所有情况下都这么做(我也不这么认为)