美文网首页
提示十八

提示十八

作者: 飞絮搅青冥 | 来源:发表于2022-06-13 22:54 被阅读0次

今天来看提示十八:复合优先于继承。

书中认为继承打破了封装,这是继承最大的危害,书中举了这样一个例子:

public class InstrumentedHashSet<E> extends HashSet<E> {
    private int addCount = 0;

    public InstrumentedHashSet() {
    }

    public InstrumentedHashSet(int initCap, float loadFactor) {
        super(initCap, loadFactor);
    }

    @Override
    public boolean add(E e) {
        addCount++;
        return super.add(e);
    }

    @Override
    public boolean addAll(Collection<? extends E> c) {
        addCount += c.size();
        return super.addAll(c);
    }

    public int getAddCount() {
        return addCount;
    }
}

这段代码看上去很正常,我也没有看出什么问题,但是在执行addAll方法的时候就会出现问题。原来在 HashSet 内部, addAll 方法是基于它的 add 方法来实现的,所以使用InstrumentedHashSet的addAll的时候会再次调用它自己的add方法多次,就会造成统计数据问题了。这一点我是真的没有想到,因为使用的super的方法,所以在不太清楚父类具体实现方法的时候盲目去使用继承是有很大风险的。导致子类脆弱的一个相关原因是,它们的父类在后续的发布版本中可以添加新的方法。

为了解决这两个缺点,书中提倡使用组合的方式来代替继承,使用has a而非is a可以解决很大一部分问题。继承功能更大强大,所以限制也更多,使用的时候值得我们更加警惕,真的符合is a的条件,再去使用。书中提到 Guava 为所有的 Collection 接口提供转发类,我特意去看了一下,发现果然Guava给这些类都提供了不可变类,以后使用的时候如果集合不会发生变化,可以考虑优先使用Guava的不可变版本。

可变集合接口 不可变版本
Collection ImmutableCollection
List ImmutableList
Set ImmutableSet
SortedSet ImmutableSortedSet
Map ImmutableMap
SortedMap ImmutableSortedMap

相关文章

  • 提示十八

    今天来看提示十八:复合优先于继承。 书中认为继承打破了封装,这是继承最大的危害,书中举了这样一个例子: 这段代码看...

  • 提示18-19可逆性

    今天继续学习本书的提示十八和十九。先看提示: 提示十八:不设最终决定。提示十九:放弃追逐时尚。 这章围绕可逆性开始...

  • 温馨提示(十八)

    1、如果你决意去做一件事,就不要再问自己和别人值不值得,心甘情愿才能理所当然,理所当然才会义无反顾。愿你在自己存在...

  • 提示三十八

    提示三十八:使用接口模拟可扩展的枚举。 因为枚举类无法被继承,作者为了扩展枚举,所以让他们共同实现了相同的接口,一...

  • 提示二十八

    提示二十八: 列表优于数组。 数组是协变的,具体化的,泛型是不变的(对于任何两种不同的类型 Type1 和 Typ...

  • 提示38-39

    今天学习有关崩溃和断言的内容,先看提示: 提示三十八:尽早崩溃。提示三十九:使用断言去预防不可能的事情。 作者认为...

  • 提示28版本控制

    今天继续学习有关版本控制的内容,先看提示: 提示二十八:永远使用版本控制。 作者从给我们一个从之前的错误中后悔的能...

  • 提示四十八:谨慎使用Stream并行

    提示四十八:谨慎使用Stream并行。 Java8 Stream中可以通过parallel方法非常简单的来实现并行...

  • "降龙十八掌"变"二十八掌" 金庸新全集反响平平

    "降龙十八掌"变"二十八掌" 金庸新全集反响平平 核心提示:已85岁高龄的金庸花了6年时间,第三次埋首大修的全套武...

  • 我为亲爱的肝脏代言—38

    【哪些表现提示肝脏细胞损伤】 每日一更(2020.12.29,第三十八期) 第九个表现:大象腿(大腿内侧和外侧胖)...

网友评论

      本文标题:提示十八

      本文链接:https://www.haomeiwen.com/subject/wreamrtx.html