java-参数“仅在有意义的子类”的详细解释是什么?
作者:互联网
从名为How to Design a Good API and Why it Matters的演示文稿中
我停留在演示文稿的第25页上,其中说:
Public classes should not subclass other public classes for ease of
implementation
它给了我们一个例子(Java语法):
Bad: Properties extends Hashtable
Stack extends Vector
Good: Set extends Collection
但是,为什么这些例子不好又好?
解决方法:
因为属性不是哈希表,并且它们不能互换使用,即,您不希望用户在仅需要哈希表的地方使用属性.堆栈与向量相同.
好的设计应努力简化API.如果要设计堆栈,则基本上应该只提供push和pop方法.从Vector公开继承会泄漏用户不需要知道的实现细节.除了混乱,这意味着您永远无法更改实现!因此,如果明天不推荐使用Vector(我相信实际上是在这一点上),您仍然会使用使用它的Stack,因为客户可能会期望使用它.更改实现会违反向后兼容性,这是另一个设计目标.
注意上面的例子不是随机的. Vector和Hashtable都是被视为过时的类(请参阅最后的注释here和here).这些类具有一些设计缺陷,已由ArrayList和HashMap或类似的类替代.这也使得从它们继承的类也过时了.如果不是继承使用合成,而是可以轻松地将Vector和Hashtable交换为它们的现代副本,而不会影响任何用户.
另一方面,Set是一个集合.也就是说,如果某些代码指定需要某种Collection,则用户可以自由提供Set(或List或其他).如果对此集合应提供的内容没有特定要求(例如,没有随机访问权限),则可以为API提供更大的灵活性.
标签:inheritance,subclass,api-design,java 来源: https://codeday.me/bug/20191028/1955724.html