Java业务开发常见错误100例
朱晔
贝壳金服资深架构师
立即订阅
5379 人已学习
课程目录
已更新 34 讲 / 共 38 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 业务代码真的会有这么多坑?
免费
代码篇 (20讲)
01 | 使用了并发工具类库,线程安全就高枕无忧了吗?
02 | 代码加锁:不要让“锁”事成为烦心事
03 | 线程池:业务代码最常用也最容易犯错的组件
04 | 连接池:别让连接池帮了倒忙
05 | HTTP调用:你考虑到超时、重试、并发了吗?
06 | 20%的业务代码的Spring声明式事务,可能都没处理正确
07 | 数据库索引:索引并不是万能药
08 | 判等问题:程序里如何确定你就是你?
09 | 数值计算:注意精度、舍入和溢出问题
10 | 集合类:坑满地的List列表操作
11 | 空值处理:分不清楚的null和恼人的空指针
12 | 异常处理:别让自己在出问题的时候变为瞎子
13 | 日志:日志记录真没你想象的那么简单
14 | 文件IO:实现高效正确的文件读写并非易事
15 | 序列化:一来一回你还是原来的你吗?
16 | 用好Java 8的日期时间类,少踩一些“老三样”的坑
17 | 别以为“自动挡”就不可能出现OOM
18 | 当反射、注解和泛型遇到OOP时,会有哪些坑?
19 | Spring框架:IoC和AOP是扩展的核心
20 | Spring框架:框架帮我们做了很多工作也带来了复杂度
设计篇 (6讲)
21 | 代码重复:搞定代码重复的三个绝招
22 | 接口设计:系统间对话的语言,一定要统一
23 | 缓存设计:缓存可以锦上添花也可以落井下石
24 | 业务代码写完,就意味着生产就绪了?
25 | 异步处理好用,但非常容易用错
26 | 数据存储:NoSQL与RDBMS如何取长补短、相辅相成?
安全篇 (1讲)
27 | 数据源头:任何客户端的东西都不可信任
不定期加餐 (6讲)
加餐1 | 带你吃透课程中Java 8的那些重要知识点(上)
加餐2 | 带你吃透课程中Java 8的那些重要知识点(下)
加餐3 | 定位应用问题,排错套路很重要
加餐4 | 分析定位Java问题,一定要用好这些工具(一)
加餐5 | 分析定位Java问题,一定要用好这些工具(二)
加餐6 | 这15年来,我是如何在工作中学习技术和英语的?
Java业务开发常见错误100例
15
15
1.0x
00:00/00:00
登录|注册

21 | 代码重复:搞定代码重复的三个绝招

朱晔 2020-05-02
你好,我是朱晔。今天,我来和你聊聊搞定代码重复的三个绝招。
业务同学抱怨业务开发没有技术含量,用不到设计模式、Java 高级特性、OOP,平时写代码都在堆 CRUD,个人成长无从谈起。每次面试官问到“请说说平时常用的设计模式”,都只能答单例模式,因为其他设计模式的确是听过但没用过;对于反射、注解之类的高级特性,也只是知道它们在写框架的时候非常常用,但自己又不写框架代码,没有用武之地。
其实,我认为不是这样的。设计模式、OOP 是前辈们在大型项目中积累下来的经验,通过这些方法论来改善大型项目的可维护性。反射、注解、泛型等高级特性在框架中大量使用的原因是,框架往往需要以同一套算法来应对不同的数据结构,而这些特性可以帮助减少重复代码,提升项目可维护性。
在我看来,可维护性是大型项目成熟度的一个重要指标,而提升可维护性非常重要的一个手段就是减少代码重复。那为什么这样说呢?
如果多处重复代码实现完全相同的功能,很容易修改一处忘记修改另一处,造成 Bug;
有一些代码并不是完全重复,而是相似度很高,修改这些类似的代码容易改(复制粘贴)错,把原本有区别的地方改为了一样。
今天,我就从业务代码中最常见的三个需求展开,和你聊聊如何使用 Java 中的一些高级特性、设计模式,以及一些工具消除重复代码,才能既优雅又高端。通过今天的学习,也希望改变你对业务代码没有技术含量的看法。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Java业务开发常见错误100例》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(20)

  • 待时而发 置顶
    太实用了 老师。我还真的在日常开发中碰到过太多您所提到的这些问题了,而且很多

    作者回复: 有收获就好

    2020-05-02
    5
  • Asura 置顶
    写得真好 想问下项目里用到不同设计模式 类的命名规范 以及放置这些设计模式的包的命名规范是怎么样的

    作者回复: 包名没有规范,涉及到设计模式类名可以以

    Locker
    Iterator
    Extractor
    Accessor
    Validator
    Formatter
    Converter
    Replacer
    Comparer
    Manager
    Combiner
    Parser
    Encoder
    Decoder
    Importer
    Exporter
    Editor
    Modifier
    Evaluator
    Locator
    Creator
    Initializer
    Reader
    Writer
    Activator
    Finder
    Builder
    Selector
    Visitor
    Loader
    Descriptor
    Generator
    Adapter
    Listener
    Wrapper
    Mapper
    Binder
    Invoker
    Executor
    Detector
    Tracer
    Decorator
    Mapper
    Resolver
    Processor
    Advisor
    Dispatcher
    Consumer
    Producer
    Publisher
    Subscriber
    Handler
    Filter
    Interceptor
    Provider
    Container
    单词作为前后缀 以提现类作用或者模式

    2020-05-14
    1
  • Darren
    一、观察者模式的在Spring中的使用:spring listener就是基于观察者模式的:主要是三个组件:
    1. 事件,需要继承ApplicationEvent,即观察者模式中的"主题",可以看做一个普通的bean类,用于保存在listener的业务逻辑中需要的一些字段;
    2. 事件listener,需要实现ApplicationListener<E extends ApplicationEvent>,即观察者模式中的"观察者",在主题发生变化时收到通知,并作出相应的更新,加泛型表示只listen某种类型的事件;
    3. 事件发布器,需要实现ApplicationEventPublisherAware,获取spring底层组件ApplicationEventPublisher,并调用其方法发布事件,即"通知"观察者。
    二、Bean 属性复制,原理肯定是反射了,其实自己实现也很简单,或者反射或者内省,内省实现最简单,以前使用内省实现过。现在主要是用hutool,超级好用的工具包,里面基本你想要的工具类都有,欢迎大家使用https://hutool.cn/

    作者回复: 感谢分享

    2020-05-05
    9
  • 小白程序之路
    弱弱的说一下哈,感觉老师的第一种利用工厂模式,根据类型加上魔法值(UserCart)来获取指定的类型策略存在隐患,如果后期有小伙伴把这些实现类名改了怎么办,或者新加了一种策略,不是以(UserCart)结尾命名也会在运行时产生问题

    作者回复: 其实这里不是类名,是Bean的名字,可以把字符串统一到常量,而不是像demo一样使用魔法值

    2020-05-03
    1
    2
  • pedro
    这段时间忙,没有时间来仔细读文章和消化,趁着五一来看了一看。尝试回答一下今天的问题,问题1,观察者模式是一种很常见的解耦方式,多数应用在了事件发布订阅这种业务场景下,有名的当属guava的EventBus了。问题2,对于属性的copy,这类的工具可太多了,无论是spring,guava,apache commons都有涉及,当然我个人比较喜欢hutool一点,因为支持各种参数来调整属性的拷贝。
    2020-05-02
    2
  • jiarupc
    这篇文章、demo值得看几十几百遍,感觉打通了任督二脉。

    以前学过设计模式、Java的高级特性,但只能算看过,完全不知道怎么用在工作。

    看完这篇文章才发现,代码还能这样写。刚好,公司有一大堆乱七八糟的代码,实践的时候到了。

    作者回复: :)

    2020-05-07
    1
  • Geek_2e9285
    这个是不是很类似于状态机模式。我发现在业务场景里面,状态机模式,和策略模式很常用。

    作者回复: 策略 状态机 职责链 都比较常用

    2020-05-03
    1
  • 旅途
    观察者模式最先想到的是swing框架里的button,然后是tomcat里面的Listener
    2020-05-03
    1
  • kyl
    很实用的知识
    2020-05-02
    1
  • hhhh
    观察者模式适合所有发布-订阅类型的场景,它的实现方式根据具体需求千变万化,可以是同步阻塞,也可以是异步非阻塞的,可以是进程内的,也可以是系统间的解耦。工作中用的多的是Guava的EventBus。
    其他工具搜了一下,cglib中BeanCopier也提供了mapping功能,基于动态代理实现,但是没有实际使用过

    作者回复: 不错

    2020-05-02
    1
  • insight
    想问一下老师,属性拷贝工具相较于直接写get和set,会有性能上的差异嘛?

    作者回复: 会有 不过一般不会存在性能瓶颈

    2020-05-02
    1
  • 小司
    代码编写的demo感觉还需严谨些,例如restful api定义的规范,常量.equals()避免NPE问题,尽量不要set而是使用builder模式,对象构造完基本不要再进行改动,这些都是一些较低级问题。大量的if、switch等逻辑判断可以使用策略加工厂加模版等模式替换,强调可读性一定非常重要,仅此稳定性。避免使用晦涩难懂的函数式编程(图省事而增加难懂及难维护的代码)
    2020-05-15
  • FelixFly
    1. 松耦合的方式一般都是用于消息发送,比如说短信发送、日志推送等等,消息队列是分布式中的松耦合
    2. Bean 属性复制:https://www.jianshu.com/p/40e0e64797b9 这篇文章基本全了

    作者回复: 感谢分享

    2020-05-12
  • 👽
    购物车的例子,我个人理解,Java8中,可以使用接口以及default来代替抽象类。我认为使用接口更好,因为接口可以多实现,但是抽象类不可多继承。

    作者回复: 也不能完全替代,抽象类可以有状态,而且接口语义上是can-do,抽象类是is-a,还是选择更符合语义的方式来实现比较好

    2020-05-12
  • 海拉鲁
    看了利用注解和反射消除重复的方法,这就是我一直苦苦寻求而不得的答案啊!
    之前就觉得这两样应该能发挥大作用但一直不得要领,还是自己对基础知识掌握的不够,感谢老师分享!

    作者回复: 有收货就好

    2020-05-09
  • QQ怪
    看完这篇之后立马就运用到我的项目中,真香!
    2020-05-08
  • #
    Bean 属性复制 mapstruct 了解一下
    2020-05-08
  • hellojd
    购物车的例子,用模板模式+工厂模式是没问题的。但用spring实现工厂,容易踩坑。一般购物车都会持有商品列表数据,spring默认是单例,不注意就出bug了。

    作者回复: 一般而言,不会把购物车数据保存在Bean里,可能会保存在Redis/Session里比较常见

    2020-05-08
    1
  • mgs2002
    很有用,已经在尝试使用抽象类替换调项目的部分重复代码

    作者回复: 👍🏻

    2020-05-06
  • 李远
    BeanUtils注意深浅拷贝的问题
    2020-05-05
收起评论
20
返回
顶部