Jér*_*nge 6 java api implementation isolation
在大型软件实现中,通常建议在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 ...;
}
}
}
Run Code Online (Sandbox Code Playgroud)
有人会争辩说API不应该引用实现代码.即使我们通过单独的文件将API代码与实现分开,也经常需要在API中导入实现代码(至少是类名).
有些技术可以通过使用完全限定名称的字符串表示来避免此类引用.该类加载该字符串,然后进行实例化.它使代码更复杂.
我的问题:将API代码从实现代码中完全分离或隔离是否有任何好处?或者这只是纯粹主义者试图达到完美而没有什么实际好处?
我一直理解要求从执行单独的接口意味着你不混合如何与你的实现是什么.因此,在上面的示例中,混合api和实现将意味着在api中暴露特定于SeparationImpl如何实现api的东西.
作为示例,请查看如何在各种集合类中实现迭代.您可以通过更具体的方法检索特定集合中的元素(例如,通过ArrayList中的位置),但这些方法不会公开,Collection因为它们特定于具体ArrayList的实现方式.
我还看到了具有巨大接口目录的项目,每个接口都有一个具体的实现,并且每个接口都在机械上重现每个方法的具体实现,这似乎是一个完全没有意义的"假装"抽象,因为它实际上并没有提供任何逻辑抽象.