最近在看guava的cache源码, 发现LocalCache.Segment类是继承ReentrantLock. 但是我看Segment只用到了lock,unlock,isHeldByCurrentThread 三个方法, 这三个方法都是public的,就是说如果用依赖的方式,这几个方法都可以调用到的.
又查了一下ReentrantLock 的子类, 发现子类包括有: java.util.concurrent.ConcurrentHashMap.Segment
那么为什么不使用依赖(ReentrantLock lock= new ReentrantLock()), 而是用继承呢?? 或者说在什么情况下能体现出继承的好处? |
|
别人还要用Segment呢 不继承哪来的ReentrantLock中的方法?
|
|
这个我想过, 所以进一步看了一下, 在guava中, Segment类的使用者是LocalCache及其内部类, 都没有使用到ReentrantLock类的任何方法呢. |
|
继承目的就 是不忘本,再创新的意思!
将可用的拿来,还可以在其拿来的基础上进行修改创新。 还有就是直接拿来使用势必导致多个地方调用,还不如我自己使用我的东西,然后内部的所有类都使用它。 |
|
同意 不是说组合一定优于继承 继承的本来目的是为了复用 不需要加入任何东西就能复用 |
|
这个我能理解, 问题在于, 继承之后,并没有使用protected方法, 也没有方法覆盖, 只调用了几个public方法. 所以不认为复用是这么用的根本原因. |
|
40分 |
This subclass inherits from ReentrantLock java doc 已经说的蛮明白的 因为subclass segment需要用到重入所的一些功能,又不想自己再去实现。所以投机了使用了ReentrantLock原有的功能。 |
这个看到了, 但不足以解答我的疑问, 它所说”avoid separate construction”, 是指避免构造new ReentrantLock? simplify some locking 仅仅是从lock.lock() 简化为 this.lock() ? 如果是, 那么什么时候用extends 什么时候用field?(似乎和这个ReentrantLock的使用没太大关系了, 变为OOP的问题了,希望一并整明白吧.) |
|
他不想自己再去实现重入锁的功能了,所以直接就拿过来用了,这个很简单的问题。再搞就是牛角尖了。。。 |