java – API和实现之间的分离是否应该完全分开?

前端之家收集整理的这篇文章主要介绍了java – API和实现之间的分离是否应该完全分开?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在大型软件实现中,通常建议在API设计与其实现之间进行分离.但在某些地方,它们必须重新连接(即,必须将实现重新连接到API).

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

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

    }

}

有人会争辩说API不应该引用实现代码.即使我们通过单独的文件将API代码与实现分开,也经常需要在API中导入实现代码(至少是类名).

有些技术可以通过使用完全限定名称的字符串表示来避免此类引用.该类加载该字符串,然后进行实例化.它使代码更复杂.

我的问题:将API代码从实现代码中完全分离或隔离是否有任何好处?或者这只是纯粹主义者试图达到完美而没有什么实际好处?

解决方法

我一直都理解将接口与实现分开的要求意味着你不要将实现方式与实现方式混为一谈.因此,在上面的示例中,混合api和实现将意味着在api中暴露特定于SeparationImpl如何实现api的东西.

作为示例,请查看如何在各种集合类中实现迭代.您可以使用更具体的方法检索特定集合中的元素(例如,通过ArrayList中的位置),但这些方法不会在Collection中公开,因为它们特定于具体ArrayList的实现方式.

我还看到了具有巨大接口目录的项目,每个接口都有一个具体的实现,并且每个接口都在机械上重现每个方法的具体实现,这似乎是一个完全没有意义的“假装”抽象,因为它实际上并没有提供任何逻辑抽象.

猜你在找的Java相关文章