返回顶部
首页 > 资讯 > 后端开发 > Python >Lombok的详细使用及优缺点总结
  • 671
分享到

Lombok的详细使用及优缺点总结

2024-04-02 19:04:59 671人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

什么是Lombok Lombok是一款Java开发插件,可以通过它定义的注解来精简冗长和繁琐的代码,主要针对简单的Java模型对象(POJO)。 好处就显而易见了,可以节省大量重复工

什么是Lombok

Lombok是一款Java开发插件,可以通过它定义的注解来精简冗长和繁琐的代码,主要针对简单的Java模型对象(POJO)。

好处就显而易见了,可以节省大量重复工作,特别是当POJO类的属性增减时,需要重复修改的Getter/Setter、构造器方法、equals方法和toString方法等。

而且Lombok针对这些内容的处理是在编译期,而不是通过反射机制,这样的好处是并不会降低系统的性能。

下面我们就看看具体的使用。

Lombok的安装

Lombok的安装分两部分:idea插件的安装和Maven中pom文件的导入。

第一步,在Idea的插件配置中搜索Lombok或官网下载本地安装。

第二步,引入pom中依赖,当前最细版本1.18.10。


<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.10</version>
</dependency>

不知道什么原因,我在使用Idea安装插件一直失败,所以只在pom中引入了依赖,也是能正常使用。

Lombok的使用

@Data

@Data最常用的注解之一。注解在类上,提供该类所有属性的getter/setter方法,还提供了equals、canEqual、hashCode、toString方法。

这里的提供什么意思?就是开发人员不用手写相应的方法,而Lombok会帮你生成。

使用@Data示例如下,最直观的就是不用写getter/setter方法。


package pojo;

public class User {
    private int id;
    private String name;
    private String pwd;

    public User(int id, String hello, String pwd) {
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getPwd() {
        return pwd;
    }

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

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

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

@Data
public class User {
    private int id;
    private String name;
    private String pwd;

}

对比之下效果显而易见。

@Setter

作用于属性上,为该属性提供setter方法; 作用与类上,为该类所有的属性提供setter方法, 都提供默认构造方法。


public class Demo {
	private int id;
	@Setter
	private String remark;
}

@Setter
public class Demo {
	private int id;
	private String remark;
}

@Getter

基本使用同@Setter方法,不过提供的是getter方法,不再赘述。

@Log4j

作用于类上,为该类提供一个属性名为log的log4j日志对象。


@Log4j
public class Demo {
}

该属性一般使用于Controller、Service等业务处理类上。与此注解相同的还有@Log4j2,顾名思义,针对Log4j2。

@AllArgsConstructor

作用于类上,为该类提供一个包含全部参的构造方法,注意此时默认构造方法不会提供。


@AllArgsConstructor
public class Demo {
	private int id;
	private String remark;
}

效果如下:


public class Demo {
    private int id;
    private String remark;

    public Demo(final int id, final String remark) {
        this.id = id;
        this.remark = remark;
    }
}

@NoArgsConstructor

作用于类上,提供一个无参的构造方法。可以和@AllArgsConstructor同时使用,此时会生成两个构造方法:无参构造方法和全参构造方法。

@EqualsAndHashCode

作用于类上,生成equals、canEqual、hashCode方法。具体效果参看最开始的@Data效果。

@NonNull

作用于属性上,提供关于此参数的非空检查,如果参数为空,则抛出空指针异常。


public class Demo {
	@NonNull
	private int id;
	private String remark;
}

@RequiredArgsConstructor

作用于类上,由类中所有带有@NonNull注解或者带有final修饰的成员变量作为参数生成构造方法。

@Cleanup

作用于变量,保证该变量代表的资源会被自动关闭,默认调用资源的close()方法,如果该资源有其它关闭方法,可使用@Cleanup(“methodName”)来指定。


public void jedisExample(String[] args) {
    try {
        @Cleanup Jedis jedis =   RedisService.getJedis();
    } catch (Exception ex) {
        logger.error(“Jedis异常:”,ex)
    }
}

效果相当于:


public void jedisExample(String[] args) {

    Jedis jedis= null;
    try {
        jedis = redisService.getJedis();
    } catch (Exception e) {
        logger.error(“Jedis异常:”,ex)
    } finally {
        if (jedis != null) {
            try {
                jedis.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

@ToString

作用于类上,生成包含所有参数的toString方法。见@Data中toString方法。

@Value

作用于类上,会生成全参数的构造方法、getter方法、equals、hashCode、toString方法。与@Data相比多了全参构造方法,少了默认构造方法、setter方法和canEqual方法。

该注解需要注意的是:会将字段添加上final修饰,个人感觉此处有些失控,不太建议使用。

@SneakyThrows

作用于方法上,相当于把方法内的代码添加了一个try-catch处理,捕获异常catch中用Lombok.sneakyThrow(e)抛出异常。使用@SneakyThrows(BizException.class)指定抛出具体异常。


@SneakyThrows
public int getValue(){
	int a = 1;
	int b = 0;
	return a/b;
}

效果如下:


public int getValue() {
    try {
        int a = 1;
        int b = 0;
        return a / b;
    } catch (Throwable var3) {
        throw var3;
    }
}

@Synchronized

作用于类方法或实例方法上,效果与synchronized相同。区别在于对象不同,对于类方法和实例方法,synchronized关键字的锁对象分别是类的class对象和this对象,而@Synchronized的锁对象分别是私有静态final对象lock和私有final对象lock。也可以指定锁对象。


public class FooExample { 

 private final Object readLock = new Object(); 

 @Synchronized 
 public static void hello() { 
     System.out.println("world");   
 } 

 @Synchronized("readLock") 
 public void foo() { 
   System.out.println("bar"); 
 } 

}

效果相当于:


public class FooExample { 

  private static final Object $LOCK = new Object[0]; 
  private final Object readLock = new Object(); 

  public static void hello() { 
    synchronized($LOCK) { 
      System.out.println("world"); 
    } 
  }   

  public void foo() { 
    synchronized(readLock) { 
        System.out.println("bar");   
    } 
  } 

}

val

使用val作为局部变量声明的类型,而不是实际写入类型。 执行此操作时,将从初始化表达式推断出类型。


public Map<String, String> getMap() {
	val map = new HashMap<String, String>();
	map.put("1", "a");
	return map;
}

效果如下:


public Map<String, String> getMap() {
    HashMap<String, String> map = new HashMap();
    map.put("1", "a");
    return map;
}

也就是说在局部变量中,Lombok帮你推断出具体的类型,但只能用于局部变量中。

@Builder

作用于类上,如果你喜欢使用Builder的流式操作,那么@Builder可能是你喜欢的注解了。


@Builder
public class Demo {
	private int id;
	private String remark;
}

效果如下:


public class Demo {
    private int id;
    private String remark;

    Demo(final int id, final String remark) {
        this.id = id;
        this.remark = remark;
    }

    public static Demo.DemoBuilder builder() {
        return new Demo.DemoBuilder();
    }

    public static class DemoBuilder {
        private int id;
        private String remark;

        DemoBuilder() {
        }

        public Demo.DemoBuilder id(final int id) {
            this.id = id;
            return this;
        }

        public Demo.DemoBuilder remark(final String remark) {
            this.remark = remark;
            return this;
        }

        public Demo build() {
            return new Demo(this.id, this.remark);
        }

        public String toString() {
            return "Demo.DemoBuilder(id="   this.id   ", remark="   this.remark   ")";
        }
    }
}

Lombok的优缺点

优点:

1、能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率
2、让代码变得简洁,不用过多的去关注相应的方法
3、属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等

缺点:

强X队友
因为Lombok的使用要求开发者一定要在IDE中安装对应的插件。如果未安装插件的话,使用IDE打开一个基于Lombok的项目的话会提示找不到方法等错误。导致项目编译失败。也就是说,如果项目组中有一个人使用了Lombok,那么其他人就必须也要安装IDE插件。否则就没办法协同开发。更重要的是,如果我们定义的一个jar包中使用了Lombok,那么就要求所有依赖这个jar包的所有应用都必须安装插件,这种侵入性是很高的。代码可读性,可调试性低
在代码中使用了Lombok,确实可以帮忙减少很多代码,因为Lombok会帮忙自动生成很多代码。
但是这些代码是要在编译阶段才会生成的,所以在开发的过程中,其实很多代码其实是缺失的。
在代码中大量使用Lombok,就导致代码的可读性会低很多,而且也会给代码调试带来一定的问题。
比如,我们想要知道某个类中的某个属性的getter方法都被哪些类引用的话,就没那么简单了。有坑
因为Lombok使代码开发非常简便,这就使得部分开发者对其产生过度依赖。在使用Lombok过程中,如果对于各种注解的底层原理不理解的话,很容易产生意想不到的结果。举一个简单的例子,我们知道,当我们使用@Data定义一个类的时候,会自动帮我们生成equals()方法 。但是如果只使用了@Data,而不使用@EqualsAndHashCode(callSuper=true)的话,会默认@EqualsAndHashCode(callSuper=false),这时候生成的equals()方法只会比较子类的属性,不会考虑从父类继承的属性,无论父类属性访问权限是否开放。这就可能得到意想不到的结果。影响升级
因为Lombok对于代码有很强的侵入性,就可能带来一个比较大的问题,那就是会影响我们对jdk的升级。按照如今JDK的升级频率,每半年都会推出一个新的版本,但是Lombok作为一个第三方工具,并且是由开源团队维护的,那么他的迭代速度是无法保证的。所以,如果我们需要升级到某个新版本的JDK的时候,若其中的特性在Lombok中不支持的话就会受到影响。还有一个可能带来的问题,就是Lombok自身的升级也会受到限制。因为一个应用可能依赖了多个jar包,而每个jar包可能又要依赖不同版本的Lombok,这就导致在应用中需要做版本仲裁,而我们知道,jar包版本仲裁是没那么容易的,而且发生问题的概率也很高。破坏封装性
以上几个问题,我认为都是有办法可以避免的。但是有些人排斥使用Lombok还有一个重要的原因,那就是他会破坏封装性。众所周知,Java的三大特性包括封装性、继承性和多态性。如果我们在代码中直接使用Lombok,那么他会自动帮我们生成getter、setter 等方法,这就意味着,一个类中的所有参数都自动提供了设置和读取方法。

参考博客:
Java开发神器Lombok使用详解
Lombok插件的安装与简单使用步骤

到此这篇关于Lombok的详细使用及优缺点总结的文章就介绍到这了,更多相关Lombok使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Lombok的详细使用及优缺点总结

本文链接: https://lsjlt.com/news/130553.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Lombok的详细使用及优缺点总结
    什么是Lombok Lombok是一款Java开发插件,可以通过它定义的注解来精简冗长和繁琐的代码,主要针对简单的Java模型对象(POJO)。 好处就显而易见了,可以节省大量重复工...
    99+
    2024-04-02
  • 详细总结Java创建文件夹的方法及优缺点
    目录一、传统API创建文件夹方式二、Java NIO创建文件夹2.1. Files.createDirectory创建文件夹2.2.Files.createDirectories创建...
    99+
    2024-04-02
  • 总结 cookie 和 session 的优缺点
    以上就是总结 cookie 和 session 的优缺点的详细内容,更多请关注编程界其它相关文章!...
    99+
    2024-04-02
  • MHA工具的优缺点归纳总结
    MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为...
    99+
    2024-04-02
  • JS中的六种继承方式以及优缺点总结
    目录前言原型链继承 构造函数继承 组合继承(原型链继承和构造函数继承组合) 寄生式继承 组合寄生式继承 extends继承 总结前言 继承是JS世界中必不可少的一个环节,号称JS的三...
    99+
    2024-04-02
  • Android Service服务详细介绍及使用总结
    Android Service服务详解 一.Service简介        Service是androi...
    99+
    2022-06-06
    android service service Android
  • Json优缺点及使用介绍
    目录1. 什么是 JSON1.1 数组字面量1.2 对象字面量1.3 混合字面量1.4 JSON 语法1.5 JSON 编码和解码2. JSON 与 XML3. 服务器端 JSON ...
    99+
    2024-04-02
  • PHP四大主流框架的优点和缺点总结
    这篇文章主要讲解了“PHP四大主流框架的优点和缺点总结”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP四大主流框架的优点和缺点总结”吧!ThinkPHPThinkPHP(FCS)是一个轻...
    99+
    2023-06-04
  • php封装pdo实例以及pdo长连接的优缺点总结
    一、前言 最近需要写脚本来实现崩溃日志的入库,不出所料又是脱离于框架的,那么行吧,咱们只能自己封装数据库相关操作了。博主这里选择了封装pdo操作数据库相关。 二、为什么选择pdo 众所周知的,php在早期的时候是带有mysql扩展的,但是后...
    99+
    2015-01-28
    php 封装 pdo
  • golang匿名函数和闭包的优缺点总结
    匿名函数简洁、匿名,但可读性差、调试困难;闭包能封装数据、管理状态,但可能导致内存消耗和循环引用。实战案例:匿名函数可用于简单数值处理,闭包可实现状态管理。 Go 语言匿名函数和闭包的...
    99+
    2024-05-05
    golang 闭包 作用域
  • Vue.Draggable使用文档超详细总结
    目录前言特性安装引入基础用法属性options配置项事件插槽HeaderFooter总结前言 Draggable为基于Sortable.js的vue组件,用以实现拖拽功能。 关于Vu...
    99+
    2024-04-02
  • AWS RDS MySQL和MariaDB Galera Cluster的优缺点比较总结
    AWS RDS MySQL     亚马逊提供的MySQL服务,部署高可用区域,单主节点、隐藏从节点,自动实现HA切换,可以进行在线扩展,超越单个数据库部署的容量,以处理高读取...
    99+
    2024-04-02
  • PHP框架的比较:优缺点详细对比
    最佳 php 框架选择:laravel:全功能、高效 orm、活跃社区(适用于大型项目)codeigniter:轻量级、可扩展、易于理解(适用于小型项目)symfony:组件化、行业标准...
    99+
    2024-05-23
    框架 php laravel
  • 详解Spring依赖注入的三种方式使用及优缺点
    目录一,属性注入1,属性注入的使用 2,属性注入的优缺点二,Setter注入1,setter注入的使用2,Setter注入的优缺点三,构造方法注入1,构造方法的使用2,构造...
    99+
    2023-05-16
    Spring依赖注入方式使用 Spring依赖注入优缺点 Spring依赖注入
  • 使用Idea连接MySQL的详细步骤总结
    一、创建普通java工程 创建工程跳过了,普通的java工程 二、导入mysql的jar包 mysql jar包下载地址 我使用的是5.1.15版本 创建目录,下载的jar包复制到目...
    99+
    2024-04-02
  • 网吧云服务器的优缺点分析报告总结
    一、网吧云服务器的优点 安全性高:网吧云服务器具有数据备份和数据加密等安全机制,能够有效防止黑客攻击和数据泄露,确保服务器的安全。 稳定性强:网吧云服务器运行稳定,不会出现宕机等问题,保证服务器的正常运行。 灵活性高:网吧云服务器可以按...
    99+
    2023-10-27
    优缺点 分析报告 网吧
  • maven优缺点及使用方法是什么
    本篇内容主要讲解“maven优缺点及使用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“maven优缺点及使用方法是什么”吧!1.什么是maven:maven是Java平台下的一款项目构...
    99+
    2023-07-05
  • Redis常见的几种使用方式及优缺点
    这篇文章主要介绍“Redis常见的几种使用方式及优缺点”,在日常操作中,相信很多人在Redis常见的几种使用方式及优缺点问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redi...
    99+
    2024-04-02
  • python函数存储在模块的优点及用法总结
    1、通过将函数存储在独立的文件中,可隐藏程序代码的细节,将重点放在程序的高层逻辑上。 2、能让你在众多不同的程序中重用函数。 将函数存储在独立文件中后,可与其他程序员共享这些文件而不...
    99+
    2024-04-02
  • oracle分区表的优缺点及用法
    本篇内容介绍了“oracle分区表的优缺点及用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!I 分区表的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作