0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Lombok如何派上用场

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-08 15:39 次阅读

Java的 record 关键字是Java 14中引入的一个新的语义特性。record 对于创建小型不可变的对象非常有用。另一方面,Lombok 是一个Java库,可以自动生成一些已知的模式为Java字节码。尽管它们都可以用来减少模板代码,但它们是不同的工具。因此,我们应该在特定情况下使用更适合我们需求的工具。

在这篇文章中,我们将探讨各种使用情况,包括java record 的一些限制。对于每个例子,我们将看到Lombok如何派上用场,并比较这两种解决方案。

小型不可变对象

我们的第一个例子,将使用Color对象。一个Color由三个整数值组成,分别代表红、绿、蓝三个通道。此外,一个颜色会暴露出它的十六进制表示。例如,RGB(255,0,0)的颜色将有一个#FF0000 的十六进制表示。此外,如果两种颜色具有相同的RGB值,我们希望它们是相等的

由于这些原因,在这种情况下选择 record 是非常合理的。

public record ColorRecord(int red, int green, int blue) {
 
    public String getHexString() {
        return String.format("#%02X%02X%02X", red, green, blue);
    }
}

同样地,Lombok允许我们使用@Value注解来创建不可变的对象。

@Value
public class ColorValueObject {
    int red;
    int green;
    int blue;

    public String getHexString() {
        return String.format("#%02X%02X%02X", red, green, blue);
    }
}

然而,从Java 14开始,record将成为这些使用情况的最常见的方式。

透明的数据载体

根据JDK增强建议(JEP 395),record 是作为不可变数据的透明载体的类。例如,我们不能强迫前面例子中的ColorRecord只暴露hexString而完全隐藏三个整数字段。

然而,Lombok允许我们自定义名称、访问级别和获取器的返回类型。让我们相应地更新ColorValueObject

@Value
@Getter(AccessLevel.NONE)
public class ColorValueObject {
    int red;
    int green;
    int blue;

    public String getHexString() {
        return String.format("#%02X%02X%02X", red, green, blue);
    }
}

因此,如果我们需要不可变的数据对象,record 是一个很好的解决方案。

然而,如果我们想隐藏成员字段,只暴露使用它们进行的一些操作,Lombok会更适合。

有许多字段的类

我们已经看到了record 是如何以一种非常方便的方式来创建小型、不可变的对象的。让我们看看如果数据模型需要更多的字段,record 会是什么样子。在这个例子中,让我们考虑Student的数据模型。

public record StudentRecord(
  String name, 
  Long studentId, 
  String email, 
  String phoneNumber, 
  String address, 
  String country, 
  int age) {
}

我们已经可以猜到,StudentRecord的实例化将很难阅读和理解,尤其是如果有些字段不是强制性的。

StudentRecord john = new StudentRecord(
  "John", null, "xxxx@qq.com", null, null, "sh", 20);

为了方便这些使用,Lombok提供了一个[Builder设计模式](/creational-design-patterns#builder)的实现。

为了使用它,我们只需要用@Builder:来注释我们的类。

@Getter
@Builder
public class StudentBuilder {
    private String name;
    private Long studentId;
    private String email;
    private String phoneNumber;
    private String address;
    private String country;
    private int age;
}

现在,让我们使用StudentBuilder来创建一个具有相同属性的对象。

StudentBuilder john = StudentBuilder.builder()
  .name("John")
  .email("xxx@qq.com")
  .country("sh")
  .age(20)
  .build();

如果我们对两者进行比较,我们可以注意到,使用构建器模式是有利的,可以带来更干净的代码。

总而言之,record 对于较小的对象来说是更好的。虽然,对于有很多字段的对象来说,缺乏创建模式会使Lombok的@Builder成为更好的选择。

可变数据

我们可以使用java record 专门处理不可变的数据。如果上下文需要一个可变的java对象,我们可以使用Lombok的@Data对象代替:

@Data 
    @AllArgsConstructor 
    public class ColorData {

        private int red; 
        private int green; 
        private int blue;

        public String getHexString() { 
            return String.format("#%02X%02X%02X", red, green, blue); 
        }

    }

一些框架可能需要带有设置器或默认构造函数的对象。例如,Hibernate就属于这种类型。当创建一个@Entity时,我们必须使用Lombok的注解或纯Java。

继承性

Java record 不支持继承。因此,它们不能被扩展或继承其他类。另一方面,Lombok的@Value对象可以扩展其他类,但它们是最终的。

@Value
public class MonochromeColor extends ColorData {
    
    public MonochromeColor(int grayScale) {
        super(grayScale, grayScale, grayScale);
    }
}

此外,@Data对象既可以扩展其他类,也可以被扩展。总之,如果我们需要继承,我们应该坚持使用Lombok的解决方案。

结论

在这篇文章中,我们已经看到Lombok和java records是不同的工具,有不同的用途。此外,我们发现Lombok更加灵活,它可以用于record 受到限制的场景。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6515

    浏览量

    87615
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    103004
  • 代码
    +关注

    关注

    30

    文章

    4557

    浏览量

    66826
收藏 人收藏

    评论

    相关推荐

    使用WinSCP轻松传输树莓派文件

      安装 WinSCP 后,您将能够以最少的设置以图形方式操作 Raspberry Pi 文件。这是一个可以随时供 Pi 使用的好工具,而且肯定可以派上用场
    的头像 发表于 08-15 14:37 1089次阅读
    使用WinSCP轻松传输树莓派文件

    太子献宝

    `为期两个月的“奔跑吧2016,资源跨年季”,抽中的工具箱奖品今天收到了,上午收到奖品下午就提着工具箱出门干活了,正好派上用场,工具箱看起来小巧金龙,挺适合外出维修带上,感觉这个工具箱非常不错`
    发表于 02-15 21:34

    TEA加密解密分享!

    不知道大家玩儿过没,我感觉涉及到安全问题的时候,会派上用场。算法原理没去研究,现在只知道怎么用,还没用在单片机上,仅仅是在vc下模拟过。算法是移植的,模拟的代码是自己写的。代码里面有注释,帮助大家使用。vc模拟TEA加密解密.zip (209.98 KB )
    发表于 10-15 04:37

    如何降低编程的难度

    平时学习,无论哪行的知识都要看一遍。学多学少都没关系。 比如我自己,连财会也看过,尽管我是学理科的。没想到竟然能派上用场。 语文数学是万物的基础知识,要永远保持在80分以上,点高点低都看这个。
    发表于 06-08 18:18

    IMS马达&软件&控制器及培训资料.part1

    工厂内部的一些资料,资料有点老,不知道能不能派上用场
    发表于 03-15 14:51 3次下载

    IMS马达&软件&控制器及培训资料.part2

    工厂内部的一些资料,资料有点老,不知道能不能派上用场
    发表于 03-15 14:50 3次下载

    IMS马达&软件&控制器及培训资料.part3

    工厂内部的一些资料,资料有点老,不知道能不能派上用场
    发表于 03-15 14:50 1次下载

    区块链在未来哪些方面会派上用场

    区块链是互联网的价值回归。1989年,伯纳斯-李于开发出万维网。万维网创立的基础,是基于开放、公平的原则而生。但时隔28年后的今天,全球互联网开始出现形色各异的垄断局面,互联网开放透明的原则被毫无节制地践踏。在中国,互联网已正式进入“美苏争霸”时代,腾讯系和阿里系几乎形成了垄断。有些平台接连爆出用户隐私泄露的情况,近期传出两家知名公司争夺用户数据等等。要改变这一切,亟需一种新的技术力量,区块链就是在这样的背景下应运而生。从技术角度解释,区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法。狭义来讲,区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构,并以密码学方式保证不可篡改和不可伪造的分布式账本。广义来讲,区块链技术是利用块链式数据结构来验证存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算范式。由此来看,能够影响未来世界的区块链应用项目,它们必须有以下几个共同特质:所在领域对数据安全需求极高所在领域对数据隐私要求极高运转计算过程需要可追溯、不可篡改可降低社会成本开放姿态,众人皆能贡献参与拥有自己独立发行的token令牌该行业在互联网格局中已高度繁荣通过充分的行业数据调研和广泛的抽样研究,我们列举以下八大可以改变世界的区块链应用方向及优秀代表项目。Tel/v(138-2881-9057)一、金融区块链应用金融领域的核心价值:促进反洗钱和顾客身份审查。在区块链的创新和应用探索中,金融是最主要的领域,区块链技术在数字货币、支付清算、智能合约、金融交易、物联网金融等多个方面存在广阔的应用前景。就拿淘宝购物来说,支付环节需要通过支付宝实现可信任担保交易,但因为淘宝和支付宝同属一支,这种信用基础就被操纵在阿里自己手里。如果把支付宝担保平台换成一个“可信任的超级系统”,让交易变得直观而安全,也就不需要第三方担保了。区块链的出现恰好可以让这个想法变成现实。比特币是目前区块链技术最广泛、最成功的运用,因为其具有不可篡改的时间戳和全网公开的特性,得到了银行、证券、保险等金融行业的广泛信赖,近些年更是疯狂暴涨,甚至在许多国家比特币已经成为了合法货币。二、游戏区块链应用游戏领域的核心价值:把游戏权利交还给游戏玩家。区块链技术去中心化、智能合约、资产交易等技术特点,能很好的解决目前游戏行业游戏数据和用户数据隐私泄漏的问题,促进游戏中虚拟数字货币的保值,实现用户与游戏开发平台公平的价值共享。在国外,区块链技术已广泛应用在游戏货币支付环节,如八百万玩家的游戏Fragoria已启动GameCredits的区块链支付网关,为游戏行业提供首个加密货币支付方案。三、社交区块链应用社交领域的核心价值:让用户自己控制数据,杜绝隐私泄露。想想为什么我们刚刚浏览完某个购物网站,总会在其他社交平台上收到类似的广告弹窗,因为数据隐私被垄断的大数据平台进行了可耻的贩卖。区块链技术在社交领域的应用目的,就是为了让社交网络的控制权从中心化的公司转向个人,实现中心化向去中心化的改变,让数据的控制权就牢牢掌握在用户自己手里。以色列轻社交APP软件Synereo,借助匿名化的区块链网络及其内嵌代币机制,充分保证用户隐私安全。同时利用标签代币化和个性化定价,帮助人们重塑社交网络形象、人与人之间关系、身份与认知。四、版权区块链应用版权领域的核心价值:重塑对知识产权的保护。区块链的技术将所有的交易都记录在区块中,且形成记录不可被篡改,因此所有交易都可以被追踪和查询到,保障了区块链上的交易透明性,避免网络中的用户非法使用具有知识产权保护的内容。对原创者来说,这是一种更便捷、更安全、更低廉的版权保护方式。?目前区块链技术多应用于数字音乐的版权保护,在线音乐平台PledgeMusic公布了一个全球分散式帐簿和公平贸易音乐数据库的综合蓝图,可以充分解决所有权,付款和透明度问题。五、云计算区块链应用云计算领域的核心价值:推动公共信任基础设施建设进程。中国信息通信研究院认为,区块链与云的结合也是必然趋势。区块链与云的结合,有两种模式,一种是区块链在云上,一种是区块链在云里。后面一种,也就是BaaS,Blockchain-as-a-Service,是指在云服务商直接把区块链作为服务提供给用户。未来,云服务企业越来越多地将区块链技术整合至云计算的生态环境中,通过提供BaaS功能,有效降低企业应用区块链的部署成本,降低创新创业的初始门槛。六、共享经济区块链应用云计算领域的核心价值:为平台构建用户信任。区块链是基于分布式和一致性的存储系统,实现对于P2P商业模式下透明真实的信用管理体系。核心是去中心化和去信任化,破解分享经济的信任痛点。P2P网贷、二手车交易、住宿分享等分享经济细分领域都已经开始尝试。区块链通过借助智能合约技术、能够自动执行满足某项条件下的操作,也能够使得更多商品“共享”,大幅降低契约建立和执行的成本。腾讯正在把智能合约运用于自行车租赁、房屋共享等领域,如果这种智能合约运用于今天火爆的共享单车领域,也许会给整个行业带来全新的改变。七、数字广告区块链应用数字广告领域的核心价值:实现广告投放精准化,保障用户隐私不受侵犯。区块链技术在数据不可篡改,去中心化,安全方面的天然优势说明其与数字广告存在天然的嫁接优势。智能合约在打击数字广告欺诈的同时还能有效提升广告交易的效率。metacrypto元数据广告链是全球首家基于区块链技术的移动广告平台,MetaCrypto采用去中心化的商业模式,不依赖任何中心化的中介机构,不依赖竞价排名的困扰,实现自由提交在线广告合约,投放效果完全不需要担心被任何环节篡改和被渠道方虚假投放问题。区块链技术开发tel/v(138-2881-9057)用户把个性化元数据设置在自己的私有设备上,私密和敏感信息都只会保留在自己的设备上,一部分可以公开的用于合约撮合元数据才会被业务区块链同步,保护好每一个用户的隐私的同时,用户才可以在本地触发广告者广告播放合约,并从中获取一定的额外奖励。(文章原标题《争议与未来 | 对于区块链技术的应用价值应有正确认知》)
    的头像 发表于 08-06 17:35 1441次阅读

    工业物联网的发展得到了哪些技术的辅助

    网络系统是未来智能工厂的基础,但成败取决于数据收集、处理和分析能力,这就是机器视觉派上用场的时候了。
    发表于 09-23 08:58 534次阅读

    服务器:深入研究八个超融合基础设施的相关用例

    有些人可能了解一些基本的超融合基础设施用例,例如服务器融合和虚拟桌面基础设施,但是超融合基础设施在其他领域也可以派上用场
    的头像 发表于 09-11 13:53 2155次阅读

    3D打印技术或将在海上风力发电机建设中派上用场

    南极熊导读:海上风力发电机的叶片制造、基座建设,3D打印技术或将可以派上用场。 GE Renewables的Haliade-X风力发电涡轮机的叶片直径超过两个足球场,已经是世界上尺寸最大、功率最大
    的头像 发表于 01-04 09:41 1877次阅读

    Lombok开发插件使用小技巧

    0x01:Lombok简介 Lombok 是一款 Java开发插件,使得 Java 开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的 Java 模型对象(POJO
    的头像 发表于 06-12 18:07 1575次阅读

    重演自己如何掉入Lombok的戏法陷阱

      https://www.ramostear.com/blog/2020/04/28/uk1860p8.html   如果您正在阅读此文,想必您对Project Lombok已经有了一段时间的了解
    的头像 发表于 10-28 11:29 1081次阅读

    Lombok同时使用@Data和@Builder的一个必须要避开的巨坑

    问题背景 Lombok @Data和@Builder分别单独分析用法 解决方法 方法一 方法二 Lombok原理 总结 问题背景 Lombok使⽤ 同时使⽤@Data和@Builder ,构建
    的头像 发表于 10-11 18:14 1632次阅读

    Lombok的使用

    在平时我们工作的时候,我们经常会使用 toString() 方法来输出一个对象的一些属性信息。Lombok 给我们提供了一个自动生成 toString() 代码的注解,可以减少代码行数,如果代码属性
    的头像 发表于 09-25 14:03 340次阅读