为什么人们宁可用Lombok,也不把成员设为public?

news2025/1/14 18:05:20

在这里插入图片描述

目录

    • 专栏导读
    • 一、从零了解JavaBean
      • 1、基本概念
      • 2、JavaBean的特征
      • 3、JavaBean的优点
    • 二、定义最简单的JavaBean
    • 三、思考一个问题,为何属性是private,然后用get/set方法?
    • 四、下面系统的分析以下,why?
    • 五、不和谐的声音,禁止使用Lombok?
    • 六、总结

专栏导读

🏆作者简介:哪吒,CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家💪 ,专注Java硬核干货分享,立志做到Java赛道全网Top N。

🏆本文收录于Java基础教程系列(进阶篇),本专栏是针对大学生、初级Java工程师精心打造,针对Java生态,逐个击破,不断学习,打通Java技术栈

🏆订阅后,可以阅读Java基础教程系列(进阶篇)中全部文章包含Java基础、Java高并发、Spring、MySQL等Java进阶技术栈

🏆还可以订阅其姐妹篇Java基础教程系列,包含全部Java基础知识点、Java8新特性、Java集合、Java多线程、Java代码实例理论结合实战,实现Java的轻松学习

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

🏆面试福音:10万字208道Java经典面试题总结(附答案)

大家好,我是哪吒。

一、从零了解JavaBean

1、基本概念

JavaBean是一种用Java语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取。众所周知,属性名称符合这种模式,其他Java 类可以通过自省机制(反射机制)发现和操作这些JavaBean 的属性。

JavaBean可以看成是一个黑盒子,即只需要知道其功能而不必管其内部结构的软件设备。黑盒子只介绍和定义其外部特征和与其他部分的接口,如按钮、窗口、颜色、形状、句柄等。通过将系统看成使用黑盒子关联起来的通讯网络,我们可以忽略黑盒子内部的系统细节,从而有效地控制系统的整体性能。

2、JavaBean的特征

在这里插入图片描述

3、JavaBean的优点

构件对组装环境具有较强的适应能力。通过主对象对组装环境的感知,协调内部对象作出反应,改变接口状态以适应环境。在必要时,可依靠外部驱动对象的引入,进一步增强对环境的适应能力。实现从分析设计到实现的平滑过渡。领域分析和设计的基本原则:将领域知识和计算机实现分离开来。将构件内部对象划分成实现用户功能的对象集和用于组装的对象集加以实现,符合分析和设计原则。最大限度地利用成熟的技术。从构件的分析、设计和实现都可借助已有的比较成熟的面向对象技术。

二、定义最简单的JavaBean

1、最简单的JavaBean

package com.nezha.mongo.bean;

public class User {

    private Integer id;

    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2、通过lombok简化get/set

package com.nezha.mongo.bean;

import lombok.Data;

@Data
public class User {

    private Integer id;

    private String name;
}

三、思考一个问题,为何属性是private,然后用get/set方法?

普遍想法

  1. 大家都这么写,我也这么写;
  2. 这是Java的封装特性,你不知道?
  3. 隐藏属性,不暴露过多细节,更安全;

四、下面系统的分析以下,why?

1、采用get/set方法其实是Java的一个协议,在1996年12月提出的java bean1.00-A,通过统一的规范可以设置对象的值(比如get、set方法)。很多框架也是在此基础上开发的,底层源码也都是通过get/set访问属性的。
2、很多时候,可以通过get/set方法,① 增加一些功能;② 增加一些特定的修改,比如打折;③ 增加一些访问逻辑;④ 还可以通过set方法触发一些事件。
3、如果你将一个属性定义为public了,而且在50处调用了,此时,产品经理来了一个需求,将此次的促销商品打五折;难道你要去修改这50处的代码吗?如果你用get/set封装了,修改对应属性的set方法即可,so easy~!
4、就像上面所说,大家都这么写,我也这么写,但是,对于大多数企业应用来说,直接将属性写成public,也是没毛病。
5、也可以理解为,“风格统一的代码更好维护”。
6、假如我新接手一个项目,要用到某个bean,我也不知道都有什么属性,一般的做法都是先new一个,然后通过小数点联想出来,如果没有get/set,那真的很烦躁。
7、现在都是面向接口编程,而Java接口中是不能定义普通的属性的,但可以定义get/set方法。
在这里插入图片描述
进一步了解一下Java封装的概念。

封装是指一个对象对其他对象隐藏其部分状态和行为,而仅向程序其他部分暴露有限的接口的能力。封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式(或者叫函数)来访问内部信息或者数据。对于封装这个特性,我们需要编程语言本身提供一定的语法机制来支持。这个语法机制就是访问权限控制。

为了解决get/set的代码臃肿问题,lombok应运而生。简单无脑,解决一切烦恼。

使用 Lombok 可以让代码更加简洁,减少冗余的代码量。使用 Lombok 时,可以使用注解来生成常用的代码,如 getter、setter、equals、hashCode 和 toString 方法,这些方法通常都是在 Java 类中需要手动编写的。
使用 Lombok 可以省去这些手动编写的步骤,使代码更加简洁。此外,使用 Lombok 还有一个好处是可以使用注解来生成构造函数和静态构造函数,这些构造函数可以接受所有属性作为参数。这样就可以避免手动编写很多构造函数的情况。因此,使用 Lombok 可以让代码更加简洁,减少冗余的代码量,提高代码的可读性和可维护性。

Lombok代替public,因为public成员的可见性太大。将成员定义为public意味着任何地方都可以访问这个成员,这可能会导致成员被意外地修改,从而影响类的稳定性和正确性。而使用Lombok可以通过自动生成getter和setter方法来保护成员的可见性,从而提高类的封装性和可维护性。此外,使用Lombok还可以帮助开发人员减少编写重复的代码,提升工作效率。

因此,为了保护成员的可见性并提升代码的可维护性,许多人宁可使用Lombok,也不愿意将类的成员设为public。

五、不和谐的声音,禁止使用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的心情来的;

使用Lombok,写代码的时候很爽,但它

  1. 污染了你的代码;
  2. 玷污了Java语言的纯粹;
  3. 破坏了Java代码的完整性、可读性、安全性;
  4. 增加了代码的耦合度;
  5. 增加了代码的调试难度;

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

六、总结

综上所述,将成员变量定义为public是不可取的,使用Lombok也不是一个明智的选择,还是老老实实的通过IDE生成get/set方法吧。

在这里插入图片描述
在这里插入图片描述

Java学习路线总结,搬砖工逆袭Java架构师

10万字208道Java经典面试题总结(附答案)

Java基础教程系列

Java基础教程系列(进阶篇)

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

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

相关文章

MySQL实战解析底层---行锁功过:怎么减少行锁对性能的影响

目录 前言 从两阶段锁说起 死锁和死锁检测 前言 MySQL 的行锁是在引擎层由各个引擎自己实现的但并不是所有的引擎都支持行锁,比如MyISAM 引擎就不支持行锁不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有…

[深入理解SSD系列综述 1.5] SSD固态硬盘参数图文解析_选购固态硬盘就像买衣服?

版权声明:付费作品,未经许可,不可转载前言SSD (Solid State Drive),即固态硬盘,通常是一种以半导体闪存(NAND Flash)作为介质的存储设备。SSD 以半导体作为介质存储数据&…

Python进阶-----面对对象4.0(面对对象三大特征之--继承)

目录 前言: Python的继承简介 1.什么是继承 2.继承的好处 3.object类 继承的相关用法 1.继承的定义与法则 2.对继承的重写 3.(单继承)多层继承 4.多继承 5.多继承重写时调用父类方法 前言: 在讲之前,我想说说中…

servlet注解开发

文章目录servlet注解开发内容回顾响应对象 HttpServletResponse重定向与请求转发ServletConfig简介案例ServletContext简介案例Servlet 注解开发简介注解使用案例WebServlet 注解详细参数综合的增删改查案例登录注册功能servlet注解开发 内容回顾 响应对象 HttpServletRespon…

推荐一个日历转换开源工具库,支持C#、Java、PHP等主流的语言

更多开源项目请查看:一个专注推荐.Net开源项目的榜单 日历对我们来说,最熟悉的就是阳历和农历,在中国每年都有固定的节日、节气、中国特有传统节日,有些节日是固定的,但是节气这些都需要我们经过一定规则换算出来。 所…

【JavaSE】数组的定义和使用(上)

数组的定义和使用(上)6-数组的定义与使用1. 数组的基本概念1.1 为什么要使用数组1.2 什么是数组1.3 数组的创建及初始化1.3.1 数组的创建1.3.2 数组的初始化1.4 数组的使用1.4.1 数组中元素的访问1.4.2 遍历数组2. 数组是引用类型2.1 初始JVM的内存分布2…

【Python - Matplotlib】P1 Matplotlib2D 快速入门

Matplotlib 2D什么是,为什么选择快速上手三层结构图像层结构一览图画图三步法补充画布设置设定图像的长宽以及清晰度代码将图片保存前言 本节为 Matplotlib 简单专题第一节,简单介绍 Matplotlib 的结构,画图三步法,以及介绍一个简…

认识Spring(上)

作者:~小明学编程 文章专栏:Spring框架 格言:热爱编程的,终将被编程所厚爱。 目录 什么是spring 什么是IOC 传统开发 IOC DI spring的创建使用 pom.xml spring.xml 取出bean对象 ApplicationContext BeanFactory App…

【NLP相关】PyTorch多GPU并行训练(DataParallel和DistributedDataParallel介绍、单机多卡和多机多卡案例展示)

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

@Transactional详解

一、事务的概念 百度百科: 事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执 行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL&#x…

第十四届蓝桥杯三月真题刷题训练——第 1 天

目录 题目1:数列求值 代码: 题目2:质数 代码: 题目3:饮料换购 代码: 题目1:数列求值 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出…

vulnhub five86-1

总结:私钥登录,隐藏文件很多 目录 下载地址 漏洞分析 信息收集 网站渗透 爆破密码 提权 下载地址 Five86-1.zip (Size: 865 MB)Download (Mirror): https://download.vulnhub.com/five86/Five86-1.zip使用:下载以后打开压缩包,使用vm直…

数据结构(二)(嵌入式学习)

大 家 好 今天讲讲算法和哈希函数,数据结构基础请跳转数据结构(一) 数据结构干货总结(二)算法常见的数据结构及算法你以为我要都讲嘛??????&#…

SpringMVC源码:getHandler、getHandlerAdapter过程

参考资料: 《SpringMVC源码解析系列》 《SpringMVC源码分析》 《Spring MVC源码》 写在开头:本文为个人学习笔记,内容比较随意,夹杂个人理解,如有错误,欢迎指正。 前文: 《SpringMVC源码&a…

机器学习|多变量线性回归 | 吴恩达学习笔记

前文回顾:机器学习 | 线性回归(单变量) 目录 📚多维特征 📚多变量梯度下降 📚梯度下降法实践 🐇特征缩放 🐇学习率 📚特征和多项式回归 📚正规方程 &…

开发手册——一、编程规约_6.并发处理

这篇文章主要梳理了在java的实际开发过程中的编程规范问题。本篇文章主要借鉴于《阿里巴巴java开发手册终极版》 下面我们一起来看一下吧。 1. 【强制】获取单例对象需要保证线程安全,其中的方法也要保证线程安全。 说明:资源驱动类、工具类、单例工厂…

Microsoft designer 使用教程

继各种ai绘图软件诞生之后 dell 2 playground.... 微软自己研发的重量级产品 Microsoft designer 上线了 Microsoft Designer 是微软公司推出的一款设计工具,主要用于快速创建Web和移动应用程序的原型设计。它提供了一系列的工具和模板,可以帮助用户…

Python3.8.8-Django3.2-Redis-连接池-数据类型-字符串-list-hashmap

文章目录1.认识Redis1.1.优点1.2.缺点2.在Django中Redis的连接3.Redis的基础用法3.1.hashmap结构3.2.list结构4.命令行查看数据库5.作者答疑1.认识Redis Remote DIctionary Server(Redis) 是一个key-value 存储系统,是跨平台的非关系型数据库。是一个开源的使用 AN…

【分布式】什么是分布式,分布式和集群的区别又是什么?答案在正文。

文章目录1. 什么是分布式 ?2. 分布式与集群的区别 ?3.用一个请求串起来4.一个简化的架构图5.分布式环境的特点6.分布式环境下面临的问题7.总结1. 什么是分布式 ? 分布式系统一定是由多个节点组成的系统。 其中,节点指的是计算机服务器,而且这些节点一…

Stochastic Approximation —Stochastic gradient descent 随机近似方法的详解之(四)随机梯度下降

Stochastic Approximation —Stochastic gradient descent 随机近似方法的详解之(四)随机梯度下降 郑重声明:本系列内容来源 赵世钰(Shiyu Zhao)教授的强化学习数学原理系列,本推文出于非商业目的分享个人学习笔记和心得。如有侵权…