我在StackOverflow上看过the canonical类/接口命名问题,也读过很多关于这个主题的其他opinions,但我有一个相关的问题,我不确定这些地方都有答案。我倾向于讨厌IInterface或ClassImpl命名约定,因为并同意我链接的问题的答案和文章中的观点:它们是不必要的(考虑到现代集成开发环境),使代码更难阅读,而且在许多情况下,需要使用这些命名模式之一似乎意味着不正确的设计。
但是,我经常遇到这样一种情况:我有一个接口,希望将其作为API的一部分公开(通常在单独的包中),然后创建该接口的抽象实现,以包含我希望大多数(但不是所有)具体实现从中派生的一些常见功能。例如:
public interface Foo {
public String getBar();
}
public abstract class BasicFoo implements Bar {
private String bar;
@Override
public String getBar() {
return bar;
}
}
在实践中,我倾向于用Basic作为实现名称的前缀,但我所做的基本上就是一些人使用Impl后缀的目的:提供一个basic/default实现。我可以尝试一个暗示它是由内存存储(例如Bar)支持的Foo的名称,但这总是能捕获BasicFoo中的所有功能。我也不相信我应该丢弃接口并直接公开实现,因为接口提供了额外的灵活性和解耦。
有没有想过一种更好的方式来处理这种情况,或者是一种逻辑命名约定?
发布于 2013-03-24 00:29:04
Java界中的一种常见模式称为抽象的、不完整的实现AbstractSomething
;例如AbstractList
或AbstractButton
。接口和抽象类都向客户端公开。这背后的想法是,抽象类在使用API时作为起点。这对于定义了许多方法和复杂契约的接口尤其有用,比如java.util.List。接口的大多数方法都是按照客户端必须提供的抽象方法的最小集合来实现的。
例如,要实现基于AbstractList
的列表,只需提供get(index)
和size()
方法的实现。所有其他操作-迭代器、indexOf
、subList
、hashCode
... -最终委托给这两个。
https://stackoverflow.com/questions/15591597
复制相似问题