相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下。若是我某些地方写的不对,或者比较幼稚,论证不清晰,欢迎你们留言指正。code
假设有2个class:A
和B
:继承
extends
B 那么咱们就说A继承B,A是子类,B是父类,这种状况就是继承。回想一些咱们通常会在什么状况下考虑这两个东西呢?我大体想了一下,每每会有以下的场景:it
abstract class
或者interface
我想来想去,好像真的只有这两种状况了,可是这两种状况有特别的有关联,好比说公用代码这个事情,其实abstract class
和interface
(Java 8中的default method)均可以达到。table
好吧,说了这么多屁话,我就直接抛出个人观点吧,欢迎拍砖:class
abstract class
或者interface
比较常见的一个例子:咱们在实际的项目中,每每会定义好的的POJO
或者说model
,而这些model每每都会有一些名词和类型相同的属性,好比:泛型
// db table primary key private int id;
很常见吧,可是我在实际工做中遇到过很多的同事,系统定义一个名称可能为BaseModel
或者RootModel
的类,把上面的属性id
放在里面,而后整个项目中全部的model都继承这个BaseModdel类。不知道大家是否遇到过这样的同事?大家觉的这样写能有什么好处和坏处呢?搜索
先说好处吧,若是非要说能带来什么好处的话,除了少敲几下键盘,在子类中少些了这些属性之外,没看见有啥实质性的好处。可是却为项目后续的维护带来了很麻烦的事情。model
而后说这种写法的潜在问题吧:im
某一天,由于一些缘由,你想找子类A(继承了BaseModel)中的属性
id
在项目中的哪些地方使用
机智的你熟练的使用起了IDE中的find usages
,而后你就会发现你找到的使用位置很是的多,并且好多压根不是你关心的。可是没办法,你也搜索到了其余的继承了BaseModel的类的属性id的使用位置。若是项目不大,可能搜索到的熟练比较少,若是项目大了一点呢?当搜索熟练超过了50处,你接下来会怎么作?
如何避免出现这种状况呢,那就是不要使用相似这种BaseModel
的方式来使用属性继承。固然为了严谨期间,我仍是须要详细说一下这个意思,我并无彻底反对属性继承哦,明确一下:
我反对的是整个项目全部的model继承一个BaseModel,而后把公用属性放在BaseModel中
的这种想法,注意是整个项目的
上面的反面教材的例子我我的常常会遇见,因此单独拿出来讲一下,我不肯定在你们的项目中是否出现过这种状况。反正我已经被同事的这种写法坑过好多回了。
至于「组合」和「继承」其余相关的常见错误,我暂时还没想好(至少我觉的应该没人会犯),若是我后续想清楚了,或者读者朋友们有其余的建议但愿能够留言交流一下哈。