lombok使用简介

面向网络攻击行为可视化分析系统实现【WebSocket + 可视化】 本系统主要应用于网站运维管理,它解决了网站运维人员排查网络攻击行为复杂且繁琐等问题,提高了运维人员网络安全分析的效率和准确性。 阅读详情
原文地址: http://www.jianshu.com/p/365ea41b3573

Lombok简介

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

IntelliJ IDEA 使用它的方法

  • 先安装插件


    Paste_Image.png

  • 然后引入lombok的jar包
    <dependency> 
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.14</version>
    </dependency>

注解的介绍

官方注解介绍

  • @Getter and @Setter

    你可以用@Getter / @Setter注释任何字段,让lombok自动生成默认的getter / setter方法。
    默认生成的方法是public的,如果要修改方法修饰符可以设置AccessLevel的值,例如:@Getter(access = AccessLevel.PROTECTED)


    Paste_Image.png
    import lombok.AccessLevel;
    import lombok.Getter;
    import lombok.Setter;
    public class User {
     @Getter(AccessLevel.PROTECTED) @Setter private Integer id;
     @Getter @Setter private String name;
     @Getter @Setter private String phone;
    }
  • @ToString

    生成toString()方法,默认情况下,它会按顺序(以逗号分隔)打印你的类名称以及每个字段。可以这样设置不包含哪些字段@ToString(exclude = “id”) / @ToString(exclude = {“id”,”name”})
    如果继承的有父类的话,可以设置callSuper 让其调用父类的toString()方法,例如:@ToString(callSuper = true)

    import lombok.ToString;
    @ToString(exclude = {"id","name"})
    public class User {
     private Integer id;
     private String name;
     private String phone;
    }

    生成toString方法如下:

    public String toString(){
     return "User(phone=" + phone + ")";
    }
  • @EqualsAndHashCode

    生成hashCode()和equals()方法,默认情况下,它将使用所有非静态,非transient字段。但可以通过在可选的exclude参数中来排除更多字段。或者,通过在parameter参数中命名它们来准确指定希望使用哪些字段。

    @EqualsAndHashCode(exclude={"id", "shape"})
    public class EqualsAndHashCodeExample {
     private transient int transientVar = 10;
     private String name;
     private double score;
     private Shape shape = new Square(5, 10);
     private String[] tags;
     private transient int id;
    
     public String getName() {
       return this.name;
     }
    
     @EqualsAndHashCode(callSuper=true)
     public static class Square extends Shape {
       private final int width, height;
    
       public Square(int width, int height) {
         this.width = width;
         this.height = height;
       }
     }
    }

    对比代码如下:

    import java.util.Arrays;
    public class EqualsAndHashCodeExample {
     private transient int transientVar = 10;
     private String name;
     private double score;
     private Shape shape = new Square(5, 10);
     private String[] tags;
     private transient int id;
    
     public String getName() {
       return this.name;
     }
    
     @Override public boolean equals(Object o) {
       if (o == this) return true;
       if (!(o instanceof EqualsAndHashCodeExample)) return false;
       EqualsAndHashCodeExample other = (EqualsAndHashCodeExample) o;
       if (!other.canEqual((Object)this)) return false;
       if (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false;
       if (Double.compare(this.score, other.score) != 0) return false;
       if (!Arrays.deepEquals(this.tags, other.tags)) return false;
       return true;
     }
    
     @Override public int hashCode() {
       final int PRIME = 59;
       int result = 1;
       final long temp1 = Double.doubleToLongBits(this.score);
       result = (result*PRIME) + (this.name == null ? 43 : this.name.hashCode());
       result = (result*PRIME) + (int)(temp1 ^ (temp1 >>> 32));
       result = (result*PRIME) + Arrays.deepHashCode(this.tags);
       return result;
     }
    
     protected boolean canEqual(Object other) {
       return other instanceof EqualsAndHashCodeExample;
     }
    
     public static class Square extends Shape {
       private final int width, height;
    
       public Square(int width, int height) {
         this.width = width;
         this.height = height;
       }
    
       @Override public boolean equals(Object o) {
         if (o == this) return true;
         if (!(o instanceof Square)) return false;
         Square other = (Square) o;
         if (!other.canEqual((Object)this)) return false;
         if (!super.equals(o)) return false;
         if (this.width != other.width) return false;
         if (this.height != other.height) return false;
         return true;
       }
    
       @Override public int hashCode() {
         final int PRIME = 59;
         int result = 1;
         result = (result*PRIME) + super.hashCode();
         result = (result*PRIME) + this.width;
         result = (result*PRIME) + this.height;
         return result;
       }
    
       protected boolean canEqual(Object other) {
         return other instanceof Square;
       }
     }
    }
  • @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

    @NoArgsConstructor生成一个无参构造方法。当类中有final字段没有被初始化时,编译器会报错,此时可用@NoArgsConstructor(force = true),然后就会为没有初始化的final字段设置默认值 0 / false / null。对于具有约束的字段(例如@NonNull字段),不会生成检查或分配,因此请注意,正确初始化这些字段之前,这些约束无效。

    import lombok.NoArgsConstructor;
    import lombok.NonNull;
    @NoArgsConstructor(force = true)
    public class User {
      @NonNull private Integer id;
      @NonNull private String name;
      private final String phone ;
    }

    @RequiredArgsConstructor会生成构造方法(可能带参数也可能不带参数),如果带参数,这参数只能是以final修饰的未经初始化的字段,或者是以@NonNull注解的未经初始化的字段
    @RequiredArgsConstructor(staticName = “of”)会生成一个of()的静态方法,并把构造方法设置为私有的


    Paste_Image.png

    Paste_Image.png
    import lombok.NonNull;
    import lombok.RequiredArgsConstructor;
    @RequiredArgsConstructor
    public class User {
      @NonNull private Integer id ;
      @NonNull private String name = "bbbb";
      private final String phone;
    }
    //另外一个
    import lombok.NonNull;
    import lombok.RequiredArgsConstructor;
    @RequiredArgsConstructor(staticName = "of")
    public class User {
      @NonNull private Integer id ;
      @NonNull private String name = "bbbb";
      private final String phone;
    }

    @AllArgsConstructor 生成一个全参数的构造方法


    Paste_Image.png
    import lombok.AllArgsConstructor;
    import lombok.NonNull;
    @AllArgsConstructor
    public class User {
      @NonNull private Integer id ;
      @NonNull private String name = "bbbb";
      private final String phone;
    }
  • @Data

    @Data 包含了@ToString,@EqualsAndHashCode,@Getter / @Setter和@RequiredArgsConstructor的功能

  • @Accessors

    @Accessors 主要用于控制生成的getter和setter
    主要参数介绍

    • fluent boolean值,默认为false。此字段主要为控制生成的getter和setter方法前面是否带get/set
    • chain boolean值,默认false。如果设置为true,setter返回的是此对象,方便链式调用方法
    • prefix 设置前缀 例如:@Accessors(prefix = “abc”) private String abcAge 当生成get/set方法时,会把此前缀去掉


    Paste_Image.png

  • @Synchronized

    给方法加上同步锁

    import lombok.Synchronized;
    public class SynchronizedExample {
     private final Object readLock = new Object();
    
    @Synchronized
    public static void hello() {
      System.out.println("world");
    }
    
    @Synchronized
    public int answerToLife() {
      return 42;
    }
    @Synchronized("readLock")
    public void foo() {
      System.out.println("bar");
     }
    }
    //等效代码
    public class SynchronizedExample {
    private static final Object $LOCK = new Object[0];
    private final Object $lock = new Object[0];
    private final Object readLock = new Object();
    
    public static void hello() {
      synchronized($LOCK) {
        System.out.println("world");
      }
    }
    
    public int answerToLife() {
     synchronized($lock) {
        return 42;
      }
    }
    
    public void foo() {
      synchronized(readLock) {
        System.out.println("bar");
      }
    }
    }
  • @Wither

    提供了给final字段赋值的一种方法

    //使用lombok注解的
    import lombok.AccessLevel;
    import lombok.NonNull;
    import lombok.experimental.Wither;
    public class WitherExample {
    @Wither private final int age;
    @Wither(AccessLevel.PROTECTED) @NonNull private final String name;
    
    public WitherExample(String name, int age) {
      if (name == null) throw new NullPointerException();
      this.name = name;
      this.age = age;
    }
    }
    //等效代码
    import lombok.NonNull;
    public class WitherExample {
    private final int age;
    private @NonNull final String name;
    
    public WitherExample(String name, int age) {
      if (name == null) throw new NullPointerException();
      this.name = name;
      this.age = age;
    }
    
    public WitherExample withAge(int age) {
      return this.age == age ? this : new WitherExample(age, name);
    }
    
    protected WitherExample withName(@NonNull String name) {
      if (name == null) throw new java.lang.NullPointerException("name");
      return this.name == name ? this : new WitherExample(age, name);
    }
    }
  • @onX

    在注解里面添加注解的方式

直接看代码

public class SchoolDownloadLimit implements Serializable {
    private static final long serialVersionUID = -196412797757026250L;

    @Getter(onMethod = @_({@Id,@Column(name="id",nullable=false),@GeneratedValue(strategy= GenerationType.AUTO)}))
    @Setter
    private Integer id;

    @Getter(onMethod = @_(@Column(name="school_id")))
    @Setter
    private Integer schoolId;


    @Getter(onMethod = @_(@Column(name = "per_download_times")))
    @Setter
    private Integer perDownloadTimes;

    @Getter(onMethod = @_(@Column(name = "limit_time")))
    @Setter
    private Integer limitTime;

    @Getter(onMethod = @_(@Column(name = "download_to_limit_an_hour")))
    @Setter
    private Integer downloadToLimitInHour;

    @Getter(onMethod = @_(@Column(name = "available")))
    @Setter
    private Integer available = 1;
}
  • @Builder

    @Builder注释为你的类生成复杂的构建器API。
    lets you automatically produce the code required to have your class be instantiable with code such as:

    Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();

直接看官方示例,对比一下就都明白了

//使用lombok注解的
import lombok.Builder;
 import lombok.Singular;
 import java.util.Set;
 @Builder
 public class BuilderExample {
   private String name;
   private int age;
   @Singular private Set<String> occupations;
 }
//等效代码
import java.util.Set;
class BuilderExample {
    private String name;
    private int age;
    private Set<String> occupations;

    BuilderExample(String name, int age, Set<String> occupations) {
        this.name = name;
        this.age = age;
        this.occupations = occupations;
    }

    public static BuilderExampleBuilder builder() {
        return new BuilderExampleBuilder();
    }

    public static class BuilderExampleBuilder {
        private String name;
        private int age;
        private java.util.ArrayList<String> occupations;

        BuilderExampleBuilder() {
        }

        public BuilderExampleBuilder name(String name) {
            this.name = name;
            return this;
        }

        public BuilderExampleBuilder age(int age) {
            this.age = age;
            return this;
        }

        public BuilderExampleBuilder occupation(String occupation) {
            if (this.occupations == null) {
                this.occupations = new java.util.ArrayList<String>();
            }

            this.occupations.add(occupation);
            return this;
        }

        public BuilderExampleBuilder occupations(Collection<? extends String> occupations) {
            if (this.occupations == null) {
                this.occupations = new java.util.ArrayList<String>();
            }

            this.occupations.addAll(occupations);
            return this;
        }

        public BuilderExampleBuilder clearOccupations() {
            if (this.occupations != null) {
                this.occupations.clear();
            }

            return this;
        }

        public BuilderExample build() {
            // complicated switch statement to produce a compact properly sized immutable set omitted.
            // go to https://projectlombok.org/features/Singular-snippet.html to see it.
            Set<String> occupations = ...;
            return new BuilderExample(name, age, occupations);
        }

        @java.lang.Override
        public String toString() {
            return "BuilderExample.BuilderExampleBuilder(name = " + this.name + ", age = " + this.age + ", occupations = " + this.occupations + ")";
        }
    }
}
  • @Delegate

    这个注解也是相当的牛逼,看下面的截图,它会该类生成一些列的方法,这些方法都来自与List接口


    Paste_Image.png

附带一个我使用的例子
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;

@Entity
@Table(name= Constants.TABLE_SCHOOL_DOWNLOAD_LIMIT)
@RequiredArgsConstructor(staticName = "of")
@Accessors(chain = true)
@ToString
public class SchoolDownloadLimit implements Serializable {
    private static final long serialVersionUID = -196412797757026250L;

    @Getter(onMethod = @_({@Id,@Column(name="id",nullable=false),@GeneratedValue(strategy= GenerationType.AUTO)}))
    @Setter
    private Integer id;

    @Getter(onMethod = @_(@Column(name="school_id")))
    @Setter
    private Integer schoolId;

    @Getter(onMethod = @_(@Column(name = "per_download_times")))
    @Setter
    private Integer perDownloadTimes;

    @Getter(onMethod = @_(@Column(name = "limit_time")))
    @Setter
    private Integer limitTime;

    @Getter(onMethod = @_(@Column(name = "download_to_limit_an_hour")))
    @Setter
    private Integer downloadToLimitInHour;

    @Getter(onMethod = @_(@Column(name = "available")))
    @Setter
    private Integer available = 1;

    @Getter(onMethod = @_(@Column(name = "create_time")))
    @Setter
    private Date createTime;

    @Getter(onMethod = @_(@Column(name = "update_time")))
    @Setter
    private Date updateTime;
}

就介绍这么多了,更多的注解请看官方文档

    </div>
    <!--  -->

    <div class="show-foot">
      <a class="notebook" href="/nb/9703064">
        <i class="iconfont ic-search-notebook"></i>
        <span>java</span>


Flink CDC 实战:5分钟搞定PostgreSQL数据实时同步(附避坑指南) 本文详细介绍了如何使用Flink CDC实现PostgreSQL数据的实时同步,包括环境配置、逻辑复制槽创建、Flink环境搭建及实战验证。通过5分钟快速指南,帮助开发者高效搭建实时数据管道,并提供了常见问题排查和生产环境优化建议。 阅读详情

相关推荐

解决 NLPIR (中科院分词) License 过期问题

因为学习需要,使用到了中文分词技术,网上搜索一番,最终选择了名气比较大的中科院分词器(NLPIR/ICTCLAS)。 用了几个月之后突然报错: E:\code\URLClassifier\Data\NLPIR.user Not valid license or your license expired! Please feel free to contact pipy_zhan

勇敢向前冲 1万+

lombok构造模式

lombok常用注解 @Getter / @Setter 可以作用在类上和属性上,放在类上,会对所有的非静态(non-static)属性生成Getter/Setter方法,放在属性上,会对该属性生成Getter/Setter方法。并可以指定Getter/Setter方法的访问级别。@EqualsAndHashCode 默认情况下,会使用所有非瞬态(non-transient)和非静态(non-s...

逸轩 3805

在 Ansys CFX Pre 中配置 RGP 表的分步指南

掌握在 Ansys CFX Pre 中设置 RGP 表的技巧,以优化仿真精度和效率。

jkh920184196的博客 1664

Lombok中的三个构造方法(annotation):@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsContructor

@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsContructorTOC 在Lombok中使用这三个annotation来完成项目中对于不同构造方法的需求。 @NoArgsConstructor : 生成一个无参数的构造方法,这个annotation在与其他的annotation配合起来使用的时候更加能凸显出他的重要性,当在使用hibe...

weixin_44947740的博客 1万+

Docker “docker login“ 失败? 登录阿里云镜像仓库仓库 unauthorized: authentication required

文章目录听说你 login fail?来,让我们解决一下!登录,撒花 听说你 login fail? 美滋滋的在服务器上安装完成Docker应用,开始配置阿里云镜像加速?然后被阿里云官方文档蹂躏?别急别急,让我来拯救你。 我们先来看看 阿里云官方文档 Docker镜像基本操作: 好家伙,emmm… 上来直接就Login Succeeded,这不简直so easy?我们也来照着操作操作: docker@default-online:~$ docker login registry.cn-hangzhou.a

zhuzicc的博客 1万+

uni踩坑笔记 - 离线打包调起微信分享后从微信返回APP时黑屏

apk能成功调起微信并进行分享操作,但分享完成后点击回到应用后应用出现黑屏的情况,并在约3-5秒后自动重启。

weixin_46737742的博客 5215

Java奇淫巧技之Lombok

背景   我们在开发过程中,通常都会定义大量的JavaBean,然后通过IDE去生成其属性的构造器、getter、setter、equals、hashcode、toString方法,当要对某个属性进行改变时,比如命名、类型等,都需要重新去生成上面提到的这些方法,那Java中有没有一种方式能够避免这种重复的劳动呢?答案是有,我们来看一下下面这张图,右面是一个简单的JavaBean,只定义了两个属性

寻道 8万+

Chrome DevTools MCP 实战完整教程

本教程介绍了Chrome DevTools MCP(Model Context Protocol)在智能Web测试中的应用。该系统通过MCP协议将Chrome开发者工具能力标准化,并与AI结合,提供了统一的测试解决方案。核心功能包括智能自动化、深度调试分析和性能监控优化。教程详细讲解了环境搭建、MCP服务器配置、参数说明及多种工具集(输入自动化、导航、设备仿真、性能分析等)的使用方法。通过mcp-use库的MCPAgent和MCPClient组件,用户可以轻松实现自然语言驱动的浏览器操作和测试流程管理。

blues_C的博客 3802

【lombok】@NoArgsConstructor/@RequirArgsConstructor/@AllArgsConstructor - 生成无参构造器,指定参数构造器或包含所有参数的构造器

这三个注解的集合接受某些字段的一个参数,简单的用于分配这个参数给这个字段。 @NoArgsConstructor生成的构造器无参数。如果这是不可能的(因为有final字段),则会导致编译错误。 除非使用@NoArgsConstructor(force=true),然后将所有的final字段都初始化为0/false/null。 对于有约束的字段,比如@NonNull,不会生成任何检查,所以请注意直到...

树洞 1万+

Cadence SPB16. 6 安装流程

1.首先下载CadenceAllegroSPBorCAD16.6安装包 下载之后运行其中的setup.exe,然后先安装第一项LicenseManager 一直按next或install, 直到被询问license时,单击cancel,然后选是和finish。 2,安装Product Installtion 直接点next跳过这一步 安装完成后,点Exit退出 3.按ctrl+alt+delete打开任务管...

wangjie36的博客 5145

AI: 机器学习的模型是如何训练的?(在试错中学习)

一句话理解机器学习一般训练过程 :通过有标签样本来调整(学习)并确定所有权重Weights和偏差Bias的理想值。 训练的目标:最小化损失函数 (损失函数下面马上会介绍) 机器学习算法在训练过程中,做的就是:检查多个样本并尝试找出可最大限度地减少损失的模型;目标就是将损失(Loss)最小化 在这里插入图片描述 上图就是一般模型训练的一般过程(试错过程),其中 模型: 将一个或多个特征作为输入,然后返回一个预测 (y’) 作为输出。为了进行简化,不妨考虑一种采用一个特征并返回一个预测的模型,如下公式

HowieXue 薛永浩的博客 3万+

lombok构造方法_最佳实践Lombok

一、Lombok简介Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码二、Lombok插件安装(Idea)在线安装:File->Settings->Plugins离线安装:如下地址可以找到所有对应版本的安装包,然后在上图界面点击设置按钮,选择Disk安装下载地址:https://plugins...

weixin_39719585的博客 5289

comsol如何实现五厚度的单元模拟?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 469

lombok简介

Lombok 一、Lombok的简介 是一个在Java开发过程中用注解的方式,简化了 JavaBean 的编写,避免了冗余和样板式代码而出现的插件,让编写的类更加简洁。 以@Data为例 在写实体类时,经常需要先定义变量 private int rid; private String rname; 手写或者自动生成,get、set、ToString方法等等操作 public int getRid() { return rid; } public

春花秋月冬雪风,留得残荷听雨声。 7万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Lombok插件之简介、IDEA集成、注解使用

目录 一、Lombok简介 二、Lombok集成IDEA 三、Lombok注解使用 一、Lombok简介 Lombok是一个Java库,通过注解它会自动插入您的编辑器和构建工具中。永远不要再编写另一个getter或equals方法,带有一个注释的类将具有功能全面的生成器,自动执行日志记录变量等等。提高开发者效率,减少代码编写量,更加简洁。 官网链接:https://projectlo...

自渡的博客 294

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Lombok简介

Lombok简介

m0_46880425的博客 550

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

LomBok在idea的安装以及lombok使用简介

LomBok在idea的安装以及lombok使用简介 和其他语言相比, Java经常因为不必要的冗长被批评。 Lombok提供了一系列注解用以在后台生成模板代码,将其从你的类中删除,从而有助于保持你的代码整洁。较少的模板意味着更简洁的代码,更易于阅读和维护。在本文中,我将涉及我经常使用的 Lombok功能,并想你展示如何使用他们生产更清晰、更简洁的代码。 1.LomBok插件在idea的安装 ...

QR 5899

Lombok —— 简介

Lombok —— 简介

m0_51976820的博客 281

LomBok-----LomBok简介和安装流程

室友玩一把练lol的时间,我把LomBok安装完了

qq_48788523的博客 505

Lombok 简介

点击左上角,关注:“锅外的大佬”专注分享国外最新技术内容帮助每位开发者更优秀地成长和其他语言相比,Java经常因为不必要的冗长被批评。Lombok提供了一系列注解用以...

liululee的博客 361
上一篇: 解决IDEA无法读取包下配置文件的问题
下一篇: Idea去除Mybatis黄色背景
程序员青戈
程序员青戈 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄10年 3万+粉丝 250原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值