当前位置: 首页 > article >正文

Java高效编程(18):优先使用组合而非继承

继承是一种实现代码重用的强大方式,但并不总是解决问题的最佳工具。只有当子类和父类之间存在真正的“是一个”关系时,继承才是合适的。例如,猫是动物,所以Cat类可以继承Animal类。不当使用继承会导致脆弱的软件设计。在包内使用继承是安全的,因为子类和父类的实现都由相同的程序员控制。当扩展那些为继承而专门设计并有文档说明的类时(第19条),使用继承也是安全的。然而,在跨包边界继承普通的具体类则很危险。请记住,本书中所说的“继承”是指实现继承(即一个类扩展另一个类)。接口继承(即类实现接口或一个接口扩展另一个接口)通常没有这些问题,因为接口继承只涉及方法的签名,而不涉及具体的实现细节。

与方法调用不同,继承违反了封装原则[Snyder86]。换句话说,子类为了正确地工作,依赖于父类的实现细节。父类的实现可能会在不同版本中发生变化,如果发生变化,子类可能会失效,即使子类的代码未作任何修改。因此,除非父类的作者专门设计并记录了它可以被扩展,否则子类必须与父类同步演进。这种依赖父类实现细节的方式增加了维护难度,也使得代码更加脆弱。

为了解释这一点,我们假设有一个程序使用了HashSet。为了优化性能,我们需要查询HashSet在创建后添加了多少元素(不是当前大小,因为移除元素后大小会减小)。为此,我们编写了一个HashSet的变体,它记录尝试插入元素的次数,并提供一个访问器来获取此计数。HashSet类包含两个可以添加元素的方法:addaddAll,因此我们需要覆盖这两个方法:

// 错误的做法 - 不恰当的使用继承!
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方法添加三个元素。注意,我们使用了Java 9引入的静态工厂方法List.of创建列表;如果您使用的是更早的版本,可以使用Arrays.asList替代:

InstrumentedHashSet<String> s = new InstrumentedHashSet<>();
s

http://www.kler.cn/news/332077.html

相关文章:

  • 宁夏众智科技OA办公系统存在SQL注入漏洞
  • HBase 性能优化 详解
  • GO语言深度探索:并发编程与高性能网络服务器实践
  • 一种简单安全的消息队列的C语言解决方案
  • CDGA|利用人工智能与边缘计算显著提升数据治理效率与效果的实践案例
  • 慢病中医药膳养生食疗管理微信小程序、基于微信小程序的慢病中医药膳养生食疗管理系统设计与实现、中医药膳养生食疗管理微信小程序的开发与应用(源码+文档+定制)
  • C++发邮件:如何轻松实现邮件自动化发送?
  • 828华为云征文|华为云Flexus云服务器X实例部署 即时通讯IM聊天交友软件——高性能服务器实现120W并发连接
  • MySQL 支持行锁还是表锁?分别有哪些优缺点?破解数据库的锁之谜:MySQL行锁与表锁的博弈
  • index.html 调用 ajax
  • 【Bug】STM32F1的PB3和PB4无法正常输出
  • 【案例73】Uclient无法读取https地址添加应用
  • MySQL 实验 3:创建数据表
  • 滚雪球学MySQL[8.2讲]:MySQL事件调度详解:定时任务的创建与管理及使用场景
  • 【web安全】——信息收集
  • cmd命令大全详解
  • Windows11系统下SkyWalking环境搭建教程
  • iSTFT 完美重构的条件详解
  • React -AppVarContext.Provider 提供者组件
  • 【回眸】Tessy 单元测试软件使用指南(四)常见报错及解决方案与批量初始化的经验