从今天起让我们忘记Java中的get/set方法吧!

2023-12-19 21:20

本文主要是介绍从今天起让我们忘记Java中的get/set方法吧!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


今天给大家推荐一款神器!让我们可以以一种更优雅的姿势编写我们的get/set方法。


曾几何时,我们写代码的时候,每次写Bean的时候都会使用快捷键生成get/set方法,有时候我经常会想,既然每一个Bean我们都会给其提供get/set方法,那么为什么还有会这个东西哪?(当然这只是一个问题,毕竟还是很有用的,这一点就是Java语言中的private、public等作用域

今天说的当然不是这个,我们讨论的是希望有一种优雅的方式编写我们的get/set方法或者说是一种优雅的简化。那我们就说一下今天的主角吧!

Lombok

Java代码简化神器!就是如此美妙!


Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。

https://projectlombok.org/
https://github.com/rzwitserloot/lombok
如何使用

1、安装IDEA插件Lombok Plugin

2、引入pom,最新版本为1.16.18

3、简单使用,设置get/set方法

4、稍微复杂一点的使用

其他使用

上述只是展示了几个最常用的特性,其他的还有很多,例如:

@NonNull、 @java.lang.Override、@Data、@SneakyThrows、@Synchronized、@Cleanup

具体的使用可以参考官方文档,这里只是给大家介绍一下如此美妙的东西!

Q:这么好的东西,他是什么原理哪?

A:首先我们应该清楚,我们第一步是需要安装IDEA的插件,只有安装了插件我们才可以在代码中直接使用get和set方法,如果没有话他会直接报错的,就是没有get和set方法,安装了插件我们就可以使用这些方法,并且在编译之后的class文件中也是有这些方法的。当然,为什么装了插件之后就可以调用了,这个问题太过深奥,这里不再细聊,有兴趣的可以参考相关文章进行学习。

一些思考

看到这里,很多人要说了,我使用的要么是SSM框架,要么是SSH框架,这些框架都可以使用逆向工程的方式生成我们的代码,当然包括Bean,我们在使用逆向工程的时候,get/set方法不都是自动生成的吗?使用这个Lombok尽管优美,我们还不是需要进行自己写注解的吗?

首先,我们先聊一下最近一个比较火的领域驱动设计中的贫血、失血、胀血和充血模型。

什么是贫血失血充血模型呢?简单来说:

1、失血模型:模型仅仅包含类的属性和getter/setter方法,业务逻辑和应用逻辑都放到服务层中。这种类在Java中叫POJO或者Bean。

2、贫血模型:贫血模型中包含了一些业务逻辑,但不包含依赖持久层的业务逻辑。这部分依赖于持久层的业务逻辑将会放到服务层中。可以看出,贫血模型中的领域对象是不依赖于持久层的。

3、充血模型:充血模型中包含了所有的业务逻辑,包括依赖于持久层的业务逻辑。所以,使用充血模型的领域层是依赖于持久层,简单表示就是 UI层->服务层->领域层<->持久层。

4、胀血模型:胀血模型就是把和业务逻辑不相关的其他应用逻辑(如授权、事务等)都放到领域模型中,这是一种极差的设计方式。

看到这里,可能大家一脸迷茫!这样说吧,领域驱动模型设计的一个特点是对于一个实体对象,它不但有相关的属性还要有其自身的方法(他的能力,可以做的事情)。

举个栗子:一个User类,不但要有人的基本属性,还要有这个人能做的事情(不仅仅是get/set方法)但是,这一看就是一个充血模型,但是只有基本的属性和get/set方法的话他就是一个失血模型了,因此对于领域驱动来说,我们可以这样操作,通过一个DTO包含其所有的基本属性和get/set方法,然后领域实体对象继承这个DTO,当然这只是一种用法!

图:领域驱动的一种使用模式

因此对于一个充血模型的领域驱动实体对象来说,他不但有属性还有他的各种方法,如果整个的都放在一个类里的话根本不好区分他到底是get/set方法还是其他功能方法,这里我们使用Lombok提供的注解的方式就刻意很完美的解决这个在编码过程中造成的不适感!

当然,对于领域驱动模型的研究还有很多,这里只是简单的介绍了我使用过的一种方式,仅供参考!

回过头来看

看到这里,貌似饶了一大圈还是没有说明白,我使用SSM好好的,然后代码都是自动生成的,我为什么还需要使用和这个Lombok哪?

其实不然,上述在介绍领域驱动的时候,我们也可以看到使用Lombok确实可以简化很多编辑器中显示的代码,是一种很优雅和美观的体现!

那我数据库有100多个表,又没法使用以前的逆向工具生成代码,我该怎么办哪?当然是造---造轮子了!

使用过MyBatis的朋友很多都知道,可以很方便的使用逆向工程生成我们需要的代码,我们如果引入Lombok的话,我们只有把他加入到逆向工程里生成我们的代码才可以避免庞大的工作量。

估计有些小伙伴们已经方了,这么高大上的东西自己怎么可能搞定那?不用担心,我个人曾经尝试过使用简单的代码实现类似的代码生成工具。当你去尝试的时候,就会知道,也不过如此!过程大致是这样的:

看一个简单的FreeMarker的关于Bean的一个简单模板配置,虽然看着复杂,但是都结构化的格式,使用模板配置我们不但可以生成Bean、还可以生成Service、Controller等任何我们需要的代码:

当然,我们也可以在开源项目的基础上进行修改的,这样的话更加容易一些!常见的有mybatis-plus提供的一个代码生成工具,可以参考!

好啦!今天给大家介绍了代码简化神器Lombok,还有代码生成器的基本思路,有了Lombok!就让我们忘了Java代码中冗长杂乱的get/set方法吧!

最近热文阅读:

1、Java面试题84集系列全集!有需要的小伙伴赶紧过来保存啦!

2、Java后端技术从0到1技术路线,一步步走向大神!

2、已经出狱的李一男和即将出狱的王欣,还能赶上这个时代吗?

4、大型网站技术架构负载均衡技术介绍及学习资源推荐

5、大型网站应用之海量数据和高并发解决方案总结一二

6、Java大型互联网公司经典面试题,论JDK源码的重要性的无限思考

7、使用Jenkins配置SpringBoot的自动化构建

更多精彩,从关注《Java后端技术》公众号开始!

这篇关于从今天起让我们忘记Java中的get/set方法吧!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/513749

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象