禁止使用Lombok,在Lombok的加持下,“小狗”.equals(“老狗”) = true

news2024/12/22 19:54:50

在这里插入图片描述

目录

    • 一、禁止使用Lombok
      • 1、jdk版本问题
      • 2、被迫营业
      • 3、可读性差
    • 二、Lombok中的真实小坑
    • 三、看看编译后的代码,到底怎么回事
      • 1、编译class
      • 2、添加一个注解@EqualsAndHashCode(callSuper = true)

大家好,我是哪吒。

一、禁止使用Lombok

我有一个同学,在一家小型互联网公司做Java后端开发,最近他们公司新来了一个技术总监,这位技术总监对技术细节很看重,一来公司之后就推出了很多"政策",比如定义了很多开发规范、日志规范、甚至是要求大家统一使用Idea进行开发。

其中有一项,就是禁止使用Lombok,但是他并没有明确的说明原因,我的同学是一个“懒加载的CRUD程序员”,不用Lombok,岂不是要费很多事儿?

他特意百度了一下,是这样说的。

看似很有道理,条条是道,但我认为有些以偏概全,自以为是了。

1、jdk版本问题

目前国内大多数Java项目,采用的都是JDK1.8,因为它够稳定,功能也完全够用,但是,如果哪一天,你的客户心血来潮,就是想用JDK11,甚至JDK17,此时,你会发现Lombok不好用了,于是,不得不将好几百个实体类,通过idea生成get/set、equals、toString等方法,很烦躁。

2、被迫营业

当你的客户获取到你的源代码之后,他也想看看,运行一下,此时发现没安装Lombok,报错了,安装Lombok,不了解这是什么,还要去百度学习一下,被迫营业,很烦躁。

3、可读性差

  1. Lombok隐藏了JavaBean的封装细节;
  2. toString()不知道会打印什么;
  3. @AllArgsConstructor提供一个全量构造器, 让外界在初始化时,可以随意修改其属性,极其不安全。如果属性过多,这个全量构造器,看起来,很鸡肋;
  4. 参数的顺序我们也无法控制,都是按照Lombok的心情来的;
  5. 使用Lombok,写代码的时候很爽,但它
    • 污染了你的代码;
    • 玷污了Java语言的纯粹;
    • 破坏了Java代码的完整性、可读性、安全性;
    • 增加了代码的耦合度;
    • 增加了代码的调试难度;

这是一种弊大于利、得不偿失的操作。

二、Lombok中的真实小坑

我在开发过程中,遇到这样一个问题,就是Lombok造成的。

@Data
public class Animals {
    private Integer id;
    private String name;
}
@Data
public class Dog extends Animals{
    private String cry;
}

在这里插入图片描述

我去,哪吒,你在侮辱我吗?一个小狗和一个老狗怎么可能会相等?这什么JB玩意,我去打游戏了,你自己玩吧~

三、看看编译后的代码,到底怎么回事

1、编译class

很多小伙伴,看到这,直接蒙了,根本不知道为什么?

这个时候,可以看看编译后的class。

public boolean equals(final Object o) {
    if (o == this) {
        return true;
    } else if (!(o instanceof Dog)) {
        return false;
    } else {
        Dog other = (Dog)o;
        if (!other.canEqual(this)) {
            return false;
        } else {
            Object this$cry = this.getCry();
            Object other$cry = other.getCry();
            if (this$cry == null) {
                if (other$cry != null) {
                    return false;
                }
            } else if (!this$cry.equals(other$cry)) {
                return false;
            }

            return true;
        }
    }
}

为什么equals只比较一个属性cry,而Animals比较了两个属性??

public boolean equals(final Object o) {
    if (o == this) {
        return true;
    } else if (!(o instanceof Animals)) {
        return false;
    } else {
        Animals other = (Animals)o;
        if (!other.canEqual(this)) {
            return false;
        } else {
            Object this$id = this.getId();
            Object other$id = other.getId();
            if (this$id == null) {
                if (other$id != null) {
                    return false;
                }
            } else if (!this$id.equals(other$id)) {
                return false;
            }

            Object this$name = this.getName();
            Object other$name = other.getName();
            if (this$name == null) {
                if (other$name != null) {
                    return false;
                }
            } else if (!this$name.equals(other$name)) {
                return false;
            }

            return true;
        }
    }
}

2、添加一个注解@EqualsAndHashCode(callSuper = true)

(1)callSuper = true

根据子类自身的字段值和从父类继承的字段值 来生成hashcode,当两个子类对象比较时,只有子类对象的本身的字段值和继承父类的字段值都相同,equals方法的返回值是true。

(2)callSuper = false

根据子类自身的字段值 来生成hashcode, 当两个子类对象比较时,只有子类对象的本身的字段值相同,父类字段值可以不同,equals方法的返回值是true。

(3)代码实例

@Data
@EqualsAndHashCode(callSuper = true)
public class Dog extends Animals{
    private String cry;
}

在这里插入图片描述

上一篇:一个关于 i++ 和 ++i 的面试题打趴了所有人

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1153324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VASSAL 3.7.4 发布,开源棋牌游戏构建引擎

导读VASSAL Engine 3.7.4 版本现已发布。VASSAL 是一个游戏引擎,用于在线构建棋盘游戏和纸牌游戏,构建的游戏可在 Internet 上或通过电子邮件实时运行。 VASSAL Engine 可在所有平台上运行,是免费的开源软件。具体更新内容包括: …

【2024版】最新Nessus工具安装激活教程,三分钟手把手教会,非常简单!收藏这一篇就够了

Nessus工具介绍 Nessus号称是世界上最流行的漏洞扫描程序,而且它开源,全世界有超过75000个组织在使用它。该工具提供完整的电脑漏洞扫描服务,并随时更新其漏洞数据库。Nessus不同于传统的漏洞扫描软件,Nessus可同时在本机或远端上…

护眼灯亮度多少合适?适合学生儿童的护眼灯推荐

为什么需要购买台灯?正常的顶灯不行吗? 正常顶灯的光照射到桌子上时,已经发散的差不多了,无法满足看书写字环境下的需要。 看书写字时人是要低头的,很容易挡住顶灯照射的光,桌上需要光的位置正好被挡住。…

如何为模型添加光照效果?

1、光照贴图的原理 光照贴图(Lightmap)是一种用于模拟光照效果的贴图技术。它通过将场景中的光照信息渲染到纹理图像中,然后将其应用到模型表面来实现对光照效果的模拟。光照贴图通常使用灰度图像来表示场景中的光照信息,白色表示…

让GPT替我写vue3代码,看的我血压升高

事情是这样子的,最近在写Vue3相关的代码,就想着能不能让GPT辅助我写代码,于是,我就先写了一个中文的prompt Prompt1: 使用vue3写一个用户登录的页面 分割线内部是GPT的回答: 使用 Vue 3 来创建一个用户登录页面需要涉…

编译源码时报错,程序包找不到

在编译源码时,出现了个问题,程序包找不到 原本这里是没有这个浮标的,无法打开点击,里面是空的,打开本地maven的库看找到相应的包也是没有问题的。 这里我尝试过删除相关文件,删除pom文件相关内容再次进行下…

Python数据可视化入门指南

Matplotlib和Plotly是两个在Python中广泛使用的数据可视化库,它们具有丰富的API和功能,用于创建各种类型的图表和图形。在本篇博客中,我们将介绍它们的主要特点和基本用法。 Matplotlib 主要特点: 高度自定义: Matp…

赋能制造业高质量发展,释放采购数字化新活力——企企通亮相武汉2023国际智能制造创新论坛

摘要 “为应对成本上升、供应端不稳定、供应链上下游协同困难、决策无数据依据等问题,利用数字化手段降本增效、降低潜在风险十分关键。在AI等先进技术发展、供应链协同效应和降本诉求等机遇的驱动下,采购供应链数字化、协同化成为企业激烈竞争的优先选…

Echats-自定义图表1

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh-cmn-Hans"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>…

设置防火墙

1.RHEL7中的防火墙类型 防火墙只能同时使用一张,firewall底层调用的还是lptables的服务: firewalld:默认 &#xff0c;基于不同的区域做规则 iptables: RHEL6使用&#xff0c;基于链表 Ip6tables Ebtables 2.防火墙的配置方式 查看防火墙状态: rootlinuxidc -]#systemct…

计算机视觉 计算机视觉识别是什么?

计算机视觉识别&#xff08;Computer Vision Recognition&#xff09;是计算机科学和人工智能领域中的一个重要分支&#xff0c;它致力于使计算机系统能够模拟和理解人类视觉的过程&#xff0c;从而能够自动识别、分析和理解图像或视频中的内容。这一领域的发展旨在让计算机具备…

原生JS 表格列拖拽 适用JqGrid

js $(function () {var d1 new dragTable();d1.init({tabel: .drag-table}); })function dragTable() {this.disX 0; // 相对按下的位置移动的距离this.outX 0; // 鼠标按下的点到大盒子边上的距离this.lanX 0; // 拖动到的位置this.$createDiv null;this.$createDivBg …

Java面向对象(进阶)特征之二:继承性

文章目录 一、继承的概述&#xff08;1&#xff09;生活中的继承&#xff08;2&#xff09; Java中的继承1、角度一&#xff1a;从上而下2、角度二&#xff1a;从下而上 &#xff08;3&#xff09;继承的好处&#xff08;4&#xff09;总结 二、继承的语法与应用举例&#xff0…

vue3引入并加载unity工程的两种方式

1、使用unity-webgl插件 npm i unity-webglunity打包后的build文件夹是这样的 需要手动删除.unityweb这个后缀&#xff0c;完成后放在vue3项目的根目录下的public文件夹下。 下面是引入unity的vue组件,其中实例化UnityWebgl时的参数地址直接引用上面的对应文件地址 <scri…

Soul CEO张璐团队创新技术与用户共建,推动网络社交空间绿色发展

近年来,随着互联网社交成为青年人交友的主要方式之一,网络黑灰产业也随之蓬勃发展,新型网络犯罪层出不穷,给用户的安全带来了巨大挑战。为了维护用户的社交安全,国家相关部门不断开展着"净网"、"清朗"等专项行动。在这个背景下,Soul App的CEO张璐及其团队积…

一招教你,如何快速搭建属于自己的AI数字人直播系统!

随着AI技术的不断发展&#xff0c;AI数字人直播系统成为了直播行业的新宠。本文将向大家介绍如何在短时间内快速搭建AI数字人直播系统&#xff0c;并寻找合适的服务商进行OEM合作&#xff0c;为用户带来全新的直播体验。 这边有2种方法你可以选择代理加盟可靠的AI数字人直播系统…

【Java 进阶篇】Java BeanUtils 使用详解

Java中的BeanUtils是一组用于操作JavaBean的工具&#xff0c;它允许你在不了解JavaBean的具体内部结构的情况下&#xff0c;访问和修改其属性。本文将详细介绍Java BeanUtils的使用&#xff0c;包括如何获取和设置JavaBean的属性&#xff0c;复制属性&#xff0c;以及如何处理嵌…

VS Code 全局搜索代码变量名时,有些文件中有这个变量但是没有被搜索到的问题

可以打开visual studio code&#xff0c;打开文件->首选项->设置&#xff0c;去掉 Use Ignore Files 这个选项。

FL Studio21.2中文版终身免费更新

FL Studio水果音乐编曲软件中文版,一款强大的音乐制作软件,可以进行音乐编曲、剪辑、录音、混音。FL Studio中文官网提供各个版本编曲软件的正版购买与下载和众多编曲软件教程。 FL Cloud 音效库包含开放版权的Loop和采样&#xff0c;以及来自 FL Studio 著名用户的艺术家独家…

【安装】自建Rustdesk Server

文章目录 RustDesk说明RustDesk优点RustDesk相关链接非Docker基于CentOSRustDesk默认程序占用端口说明 启动 hbbr 是中继服务器启动 hbbs 是ID服务器客户端配置 RustDesk说明 RustDesk优点 自建服务端。搭建在自己的云服务器就相当于独享高速带宽&#xff01;点对点通信。TCP…