第16条:复合优先于继承

Java 比继承更好的一种机制 —— 复合 本文结合《Effective Java》第四章条目16和自己的理解及实践,讲解了Java继承机制的缺陷和替代方案,文章发布于专栏Effective Java,欢迎读者订阅。 阅读详情
这里的继承是实现继承而非接口继承。
与方法调用不同的是,继承打破了封装性:
换句话说,子类依赖于其超类中特定功能的实现细节。超类的实现有可能会随着发型版本的不同而发生改变,如果真的发生了变化,子类可能会遭到破坏,即使他的代码完全没有改变。因此,子类必须跟着超类的更新而改变,除非超类是专门为扩展而设计的,并用具有很好的文档说明。
只有当子类真正是超类的子类型(subtype)时,才适合用继承,也就是是“is-a”关系时。
如果在适合于是用复合的地方是用了继承,则会不必要的暴漏实现细节。这样的到的API会把你限制在原始的实现上,永远限定了类的性能。更为严重的是,由于暴漏了内部细节,客户端就有可能直接访问这些内部细节。这样至少会导致语义上的混淆。例如:Properties,getProperty(String key)就有可能产生与get(Object key) 不同的结果。
对于你正视图扩展的类,他的API有没有缺陷?如果有,你愿意把那些缺陷传播到子类的API中?而符合则允许设计新的API来隐藏这些缺陷。


可以不扩展现有的类,而是在新类中增加一个私有域,他 引用现有类一个实例。这种设计叫做“复合(composition)”,因为现有的类变成新类的一个组件。新类中的每个实例方法都可以调用被包含的现有类实例中对应的方法,并返回他的结果。这被成为转发(forwarding),新类中的方法被成为转发方法(forwarding method)。 
ST7789T3与CST816D驱动全解析,面试技巧第11篇:嵌入式面试场景问答 10 连发。 SPI模式下,SCLK、MOSI、CS、DC、RST为必需引脚;8080模式下需连接D0-D7、WR、RD等信号线。CST816D触摸芯片通常通过I2C接口通信,需连接SCL、SDA及INT(中断)引脚。确保电源引脚(VCC、GND)稳定供电,ST7789T3典型工作电压为3.3V。显示异常时检查时序参数,如SPI时钟频率(建议≤40MHz)、数据建立时间。初始化流程需发送一系列命令序列,包括设置像素格式、扫描方向、帧率控制等。扫描方向(MADCTL)可调整显示旋转角度,需根据实际硬件布局配置。 阅读详情

相关推荐

五.卡尔曼滤波器(EKF)开发实践之五: 编写自己的EKF替换robot_pose_ekf中EKF滤波器

本系列文章主要介绍如何在工程实践中使用卡尔曼滤波器,分五个小节介绍: 一.卡尔曼滤波器开发实践之一: 五大公式 二.卡尔曼滤波器开发实践之二: 一个简单的位置估计卡尔曼滤波器 三.卡尔曼滤波器(EKF)开发实践之三: 基于三个传感器的海拔高度数据融合 四.卡尔曼滤波器(EKF)开发实践之四: ROS系统位姿估计包robot_pose_ekf详解 五.卡尔曼滤波器(EKF)开发实践之五: 编写自己的EKF替换robot_pose_ekf中EKF滤波器 也就是本文 ...

okgwf的博客 4138

类和接口

第十三条、使类和成员的可访问性最小化 设计良好的模块会隐藏所有的实现细节,把它的API和它的实现清晰地隔离开来。然后模块之间只通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况。(信息隐藏(infomation hiding)和封装(encapsulation)) 好处:可以有效地解除组成系统的各模块之间的耦合关系,使得这些模块可以独立地开发、测试、优化、使用、理解和修改。

一只程序狗的学习笔记 726

AD9371 官方例程构建及单音信号收发

项目构建基本流程和AD9361差不多,由于官方使用的ZCU102,记录下移植遇到的一些问题最终接收到正确的正弦波Errors: 0Errors: 0Errors: 0Errors: 0AD9361。

weixin_44630490的博客 2973

Effective Java 类和接口 第16条:复合优先于继承

Effective Java 类和接口 第16条:复合优先于继承 继承(inheritance)是实现代码重用的有力手段,但它并非永远是完成这项任务的最佳工作。使用不当会导致软件变得很脆弱。在包的内部使用继承是非常安全的,在那里,子类和超类的实现都处于同一个程序员的控制下。对于专门为了继承而设计的并且具有很好的文档说明的类来说,使用继承也是非常安全的。然而,对于普通的具体类进行跨超包边界的继承则...

yancyang的博客 2万+

RC模型车多电机驱动方案:从电调PWM原理到四电机安全连接实战

在电机控制领域,PWM(脉冲宽度调制)是实现精确调速的核心技术。其原理是通过调节固定周期内高电平的脉宽来编码控制指令,进而驱动电子调速器(电调)改变输出功率。这项技术对于需要多电机协同工作的场景,如RC模型车的差速转向或重型负载驱动,具有关键价值。它能实现动力的精细分配与同步,提升车辆的可控性与通过性。在实际应用中,为确保系统稳定,必须关注电流分配与信号同步问题。例如,通过为每个电机配备独立电调并采用信号并联(Y线)的方式,可以构建可靠的四电机驱动系统。这种方案能有效避免因单个电调过载或电机反电动势不一致导

weixin_30664615的博客 381

LabVIEW实战:基于DAQmx的实时正弦波生成、采集与波形图动态显示

本文详细介绍了如何使用LabVIEW和DAQmx驱动实现实时正弦波的生成、采集与动态显示。通过USB-6008数据采集卡,结合队列缓冲机制和动态波形图显示技术,构建了一个完整的信号处理系统。文章包含硬件连接、软件配置、任务设置及常见问题排查,适合LabVIEW初学者和硬件控制开发者参考。

weixin_30872337的博客 124

Effective Java 第16条 : 复合优先于继承

继承(指的是子类扩展超类,并不包含接口)是实现代码重用的有力手段,但它并不总是完成这项工作的最佳工具。不适当地使用继承会导致脆弱的软件。      与方法调用不同的是,继承打破了封装性。换句话说子类依赖于超类中特定功能的实现细节。超类的实现可能随着发行版本而变化,就有可能影响子类。因此,子类必须要跟着超类的更新而发展。除非超类是专门为扩展而设计的,并且具有很好的说明文档。

Come on ! Just Do it ! 3274

从原理到代码:一文搞懂LFM信号脉冲压缩在Matlab中的实现

本文深入解析了LFM信号脉冲压缩的核心原理与Matlab实现方法。从线性调频信号的数学表达、时频特性入手,详细讲解了如何构建多目标回波仿真环境,并重点阐述了匹配滤波器的频域实现算法。文章提供了完整的、可运行的Matlab代码,涵盖信号生成、噪声添加、脉冲压缩及性能评估等关键步骤,并探讨了加窗处理、参数选择等工程实践中的考量,为雷达信号处理的学习与实践提供了清晰指南。

weixin_29063035的博客 415

跟我学(Effective Java 2)第16条:复合优先于继承

第16条:复合优先于继承 继承是实现代码重用的有力手段,但是使用不当会导致软件变得脆弱。使用不当会导致软件变得很脆弱。在包的内部使用继承是非常安全的,在那里,子类和超类的实现都处在同一个程序员的控制之下。对于专门为了继承而设计、并且具有很好的文档说明的类来说,使用继承也是非常安全的。然而对于普通的具体类进行跨越包边界的继承,则是非常危险的。“继承”在这里特指实现继承。非接口继承。 与方法调用不同的...

Dullon_jiang的博客 232

【华为OD机试】贪吃蛇(python, java, c++, js)

贪吃蛇是一个经典游戏,蛇的身体由若干方格连接而成,身体随蛇头移动。蛇头触碰到食物时,蛇的长度会增加一格。蛇头和身体的任一方格或者游戏版图边界碰撞时,游戏结束。 下面让我们来完成贪吃蛇游戏的模拟。 给定一个NM的数组arr,代表NM个方格组成的版图,贪吃蛇每次移动一个方格。 若arr[i][j] == H,表示该方格为贪吃蛇的起始位置; 若arr[i][j] == F,表示该方格为食物, 若arr[i][j] == E,表示该方格为空格。 贪吃蛇初始长度为1,初始移动方向为向左。

A_D_I_D_A_S的博客 541

Xilinx/AMD公司7系列FPGA的ISERDESE2仿真的”天坑”(附verilog的源码vivado仿真工程)

研究LVDS输出接口的ADC与7系列(ZYNQ)FPGA对接过程中,在Vivado中搭建了ISERDESE2的仿真工程,仿真结果ISERDESE2的并行输出口一直输出X或Z,这个坑之大,耗费了我数天的时间,可以称为“天坑”了。同步复位的要求肯定是高于异步复位的,古话说得好“两害相权取其轻”,所以,跟古话对着干就对了!就当RST是同步复位吧,最后经过反复验证,发现。开始怀疑复位信号是否高电平持续时间不够长?但是没有查到复位时间的要求 : - (

FPGA艺术家的博客 171

Effective Java学习--第16条:复合优先于继承

在系统分析设计这门课中某王就不停地强调一点,就是ISA(is a 原则)。都知道继承是面向对象的一大要素,但是哪里使用复合哪里使用继承,其实还是有讲究的。可以简单的用ISA原则概括。有一个具备一定功能类,我们要对其功能进行拓展,到底是采用复合呢还是继承呢?当新类与旧类的关系是从属关系是,即cat is an animal,English book is a book,我们优先使用继承;当新类是旧类的

徐靖峰的专栏 864

Harmony:C# 动态代码补丁的5大秘密武器

Harmony 是一个开源库,它允许你在运行时修改托管代码(即使用 .NET 或 Mono 编译的语言编写的应用程序)。它通过利用 AOP(面向切面编程)的思想,可以在不重新编译代码的情况下添加、替换或修改方法的行为。这对于游戏模组(Modding)、插件开发以及调试工具非常有用。安装 Harmony要使用 Harmony,你需要首先安装它。Harmony 作为一个 NuGet 包,可以直接通过 Visual Studio 的 NuGet 包管理器进行安装。安装步骤打开 Visual Studio。

java专栏 1191

《Effective Java》阅读笔记16 复合优先于继承

《Effective Java》阅读笔记16 复合优先于继承 https://blog.youkuaiyun.com/qq_35635356/article/details/7965495

weixin_41563161的博客 360

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java 复合_Java复合优先于继承

复合优于继承继承打破了封装性(子类依赖父类中特定功能的实现细节)合理的使用继承的情况:在包内使用父类专门为继承为设计,并且有很好的文档说明,存在is-a关系只有当子类真正是父类的子类型时,才适合用继承。对于两个类A和B,只有两者之间存在"is-a"关系,类B才能拓展类A。继承机制会把父类API中的所有缺陷传播到子类中,而复合允许设计新的API来隐藏这些缺陷。复合(composition):不扩展现...

weixin_36122351的博客 401

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

第十六条:复合优先于继承

实现继承:当一个类扩展另一个类的时候 接口继承:当一个类实现一个接口的时候,或者当一个接口扩展另一个接口的时候。 本篇的继承说的是实现继承。 继承使用不当会导致软件变得很脆弱,在包的内部使用,以及使用专门为了继承而设计并有很好文档说明的类来说,使用继承是非常安全的。但是,对普通的具体类进行跨越包边界的继承,则是非常危险的。 导致子类脆弱的原因: 第一种:子类依赖于其超类中特定功能的实现细节。 与方法调用不同的是,继承打破了封装性。换句话说,子类依赖于其超类中特定功能的实现细节。超类的实现有可能随着发行版.

m0_55268339的博客 241

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Effective Java 16:复合优先于继承 Favor composition over inheritance

注: 本书使用继承(inheritance)一词,含义是实现继承(implement inheritance,当一个类扩展另一个类的时候) 本条目中讨论的问题并不适用于接口继承(interface inheritance,当一个类实现一个接口的时候,或者当一个接口扩展另一个接口的时候) ———————————————————————————————————————————————

588

(16):复合优先于继承

继承是实现代码重用的的有力手段,但它未必是最好的方法。对于普通的具体类进行跨越包边界的继承,则是非常危险的。这里的继承指的是一个类扩展另一个类的继承而非接口继承。 继承的一大缺点在于打破了封装性。子类依赖于超类中特定的功能实现细节。意味着超类如果发生版本变化,子类有可能受到破坏。除非超类是专门为了扩展而设计的。 public class InstrumentedHashSet extend

ahui2333的博客 432

effective java(16) 之复合优先于继承

effective java 之复合优先于继承 1、 继承是实现代码重用的重要手段,但它并非永远是完成这项工作的最佳工具,不恰当的使用会导致程序变得很脆弱。 在包的内部使用继承是非常安全的,子类和超类的实现都处在同一个程序员的控制之下。对于专门为了继承而设计、并且具有很好的文档说明的类来说,使用继承也是非常安全的。 然而们对于进行跨越包边界的继承,则要非常小心。“继承”在这里特指一个

Eric的博客 441

《Effective java》读书记录-第16条-复合优先于继承

与方法调用不同的是,继承打破了封装性。 public class InstrumentHashSet extends HashSet { private int addCount=0; /** * 创建一个新的实例 InstrumentHashSet * * */ pub

sunyx1130的专栏 390
上一篇: Spring技术内幕2Spring Framework的核心:IoC容器的实现
下一篇: 第17条:要么为继承设计,并提供文档说明,要么就禁止继承
partner4java
博客等级 码龄17年 481粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值