关于Java中的继承和组合的一个错误使用的例子

相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下。如果我某些地方写的不对,或者比较幼稚,论证不清晰,欢迎大家留言指正。

什么是「组合」和「继承」

假设有2个class: AB:

分别在什么情况下使用

回想一些我们一般会在什么情况下考虑这两个东西呢?我大致想了一下,往往会有如下的场景:

  • 公用代码
  • 为了表明事物之间的「共性」或者说仅仅为了「泛型」,抽取 abstract class或者 interface

我想来想去,好像真的只有这两种情况了,但是这两种情况有特别的有关联,比如说 公用代码这个事情,其实 abstract classinterface(Java 8中的default method)都可以达到。

好吧,说了这么多屁话,我就直接抛出我的观点吧,欢迎拍砖:

  • 如果你仅仅想公用代码,而且使用这些公用代码的class或者method并没有很明显的联系,那么就请使用组合。
  • 如果若干个class或者其method有比较明显的联系,那么请抽取一个 abstract class或者 interface
  • 慎用「属性继承」的特性,建议子类明确复写所需要的父类的属性。这一点尤为重要,后续会有一个例子来说明这种情况的不利面。

反面教材

比较常见的一个例子:我们在实际的项目中,往往会定义好的的 POJO或者说 model,而这些model往往都会有一些名词和类型相同的属性,比如:

// db table primary key
private int id;

很常见吧,但是我在实际工作中遇到过不少的同事,系统定义一个名称可能为 BaseModel或者 RootModel的类,把上面的属性 id放在里面,然后整个项目中所有的model都继承这个BaseModdel类。不知道你们是否遇到过这样的同事?你们觉的这样写能有什么好处和坏处呢?

先说好处吧,如果非要说能带来什么好处的话,除了少敲几下键盘,在子类中少些了这些属性以外,没看见有啥 实质性的好处。但是却为项目后续的维护带来了很麻烦的事情。

然后说这种写法的潜在问题吧:

某一天,因为一些原因,你想找子类A(继承了BaseModel)中的属性 id在项目中的哪些地方使用

机智的你熟练的使用起了IDE中的 find usages,然后你就会发现你找到的使用位置非常的多,而且好多压根不是你关心的。但是没办法,你也搜索到了其他的继承了BaseModel的类的属性id的使用位置。如果项目不大,可能搜索到的熟练比较少,如果项目大了一点呢?当搜索熟练超过了50处,你接下来会怎么做?

  • 一个一个看搜索出来的代码,看了十几二十个开始喷,然后继续一个一个往下找?
  • 直接开始喷,然后在一个一个看搜索出来的代码?

如何避免出现这种情况呢,那就是不要使用类似这种 BaseModel的方式来使用属性继承。当然为了严谨期间,我还是需要详细说一下这个意思,我并没有完全反对属性继承哦,明确一下:

我反对的是整个项目所有的model继承一个BaseModel,然后把公用属性放在BaseModel中

的这种想法,注意是整个项目的

上面的反面教材的例子我个人经常会碰见,所以单独拿出来说一下,我不确定在大家的项目中是否出现过这种情况。反正我已经被同事的这种写法坑过好多回了。

至于「组合」和「继承」其他相关的常见错误,我暂时还没想好(至少我觉的应该没人会犯),如果我后续想清楚了,或者读者朋友们有其他的建议希望可以留言交流一下哈。

Original: https://www.cnblogs.com/rollenholt/p/5301437.html
Author: Rollen Holt
Title: 关于Java中的继承和组合的一个错误使用的例子

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/539202/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • (转发)使用 YUMI UEFI 0.0.4.3 在单个 USB 磁盘上制作多系统启动盘

    YUMI 全称是 Your Universal Multiboot Integrator, 可用于制作 usb 启动盘,在同一个 usb 盘上,存放多个操作系统,比如,多个不同版本…

    Java 2023年6月9日
    089
  • Synchronized锁及其膨胀

    在并发编程中, synchronized锁因其使用简单,在线程间同步被广泛应用。下面对其原理及锁升级过程进行探究。 当实例方法被synchronized修饰时,通过当前实例调用此方…

    Java 2023年6月6日
    074
  • PHP里的“夏令虫”

    今儿,我遇到一个大怪物 — 夏令虫 ╮(╯▽╰)╭,学艺不精,因为他掉进大坑里去了。坑是这样挖的: 以前,我为了表示当前时间的”明天”、&#82…

    Java 2023年5月29日
    082
  • Mybatis学习笔记

    MyBatis 框架 MyBatis 框架 前言 第一章 框架的概述 1.三层架构 2. 三层架构请求的处理流程 3. 为什么要使用三层? 4. 三层架构模式和框架 5 .框架 6…

    Java 2023年6月5日
    059
  • RocketMq基础 看这一篇就够了

    RocketMQ 编译安装 HelloWorld 官方网站 http://rocketmq.apache.org GitHub https://github.com/apache/…

    Java 2023年6月7日
    092
  • 弃用 Windows,政府机构 5000 万台电脑将替换为国产 Linux!

    来源:https://www.linuxmi.com/50-million-pc-linux.html 开源社区的一大胜利! 继德国之后,中国现在想在 5000 万台 PC 上抛弃…

    Java 2023年6月15日
    092
  • 分布式事务篇

    点赞再看,养成习惯,微信搜索「 小大白日志」关注这个搬砖人。 文章不定期同步公众号,还有各种一线大厂面试原题、我的学习系列笔记。 分布式事务的四种处理措施 在分布式系统中实现分布式…

    Java 2023年6月8日
    084
  • 对多线程原子性的理解

    多线程原子性的理解:一个操作要么全部执行完毕,不会受到干扰而被中断;要么全都不执行 对于多线程中操作共享变量的操作,要保证它的原子性。 以下是对一个非原子性操作的分析: 在一个类中…

    Java 2023年6月15日
    096
  • Redis下载安装与配置(windows)

    一、Redis下载 Redis官网建议使用Linux进行部署,未提供windows版本的Redis,但微软开发和维护着Windows64版本的Redis。 Windows64版本的…

    Java 2023年6月8日
    093
  • JDK的下载、安装及环境变量的配置

    官网下载 JDK : 安装JDK: 双击运行下载的 jdk-8u25-windows-i586.exe即可。 假设安装目录为:D:\Program Files (x86)\Java…

    Java 2023年5月30日
    0111
  • 多线程(多线程实现方式一【继承类Thread类】)

    多线程方式实现(1) 方式1:继承Thread类。* 步骤* A:自定义类MyThread继承Thread类。* B:MyThread类里面重写run()? 为什么是run()方法…

    Java 2023年6月5日
    075
  • Nginx的安装与运行

    前言:本文是基于虚拟机上的centOS 7对Nginx的安装,可以使用 uname -a查看centOS系统版本,本文用来记录安装nginx的步骤和相关命令,方便日后使用时查看。 …

    Java 2023年6月5日
    084
  • XenServer 5.5 断电重启虚拟机磁盘丢失的修复

    1.现象 公司云平台使用的是XenServer 5.5,版本比较老了。最近几天因为机房改造,导致云环境断电,重启之后发现有2台机器无法ping到,所以再次重启,登录修复网卡,最后发…

    Java 2023年5月30日
    071
  • 【翻译】Nginx的反向代理

    本文描述代理服务器的基本配置。你能学到如何将一个请求在不同的协议上从nginx转发到被代理服务器,如何修改被转发到被代理服务器的客户端的请求头,如何配置来自被代理服务器的响应的缓存…

    Java 2023年5月30日
    083
  • Java 线程安全 与 锁

    Java 线程安全 与 锁 多线程内存模型 线程私有栈内存 每个线程 私有的内存区域 进程公有堆内存 同一个进程 共有的内存区域 为什么会有线程安全问题? 多个线程同时具有对同一资…

    Java 2023年6月5日
    089
  • 1.Spring jar包依赖

    <dependency> <groupid>commons-cli</groupid> <artifactid>commons-cl…

    Java 2023年6月13日
    0100
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球