小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

Lombox的基本使用

# Java Web,Lombok,lombok 额外说明

收录于:17天前

Project Lombok 是一个自动插入编辑器和构建工具的 Java 库。 Lombok 提供了一组有用的注释来消除 Java 类中的大量样板代码。

Lombok是一个Java代码功能增强库。它自动集成到您的编辑器和构建工具中,使您的 Java 代码更有趣。通过Lombok注解,你不再需要编写getter、setter、equals等方法,Lombok会在编译时自动为你生成它们。

将 Lombok 导入类路径或 POM 导入

  <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.16.18</version>
          <scope>provided</scope>
    </dependency>

Lombok的scope=provided表示只在编译阶段生效,不需要包含在包中。情况确实如此。 Lombok 在编译过程中可以正确地将带有 Lombok 注解的 Java 文件编译为完整的 Class 文件。

添加对 Lombok 的 IDE 工具支持
在这里插入图片描述

Lombox注释

Lombox注释

@Setter --> 此注解在属性上,可以为相应的属性自动生成Setter方法
@Getter --> 此注解在属性上,可以为相应的属性自动生成Getter方法
@Data --> 注解在类上,会为类的所有属性自动生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
@Log --> 在需要打印日志的类中使用
@AllArgsConstructor --> 此注解在类上,会自动生成全参构造函数
@NoArgsConstructor --> 此注解在类上,会自动生成无参构造器
@EqualsAndHashCode --> 此注解在类上,会自动生成对应的equals方法和hashCode方法
@NonNull --> 该注解用在属性或构造器上,会生成一个非空的声明,可用于校验参数,能帮助避免空指针。
@Cleanup --> 该注解能帮助我们自动调用close()方法,很大的简化了代码。
@ToString --> 此注解在类上,,会生成一个toString()方法,默认情况下,会输出类名、所有属性(会按照属性定义顺序),用逗号来分割。
@RequiredArgsConstructor --> 此注解在类上,自动生成部分参数构造函数
@Value --> @Value注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法
@Synchronized --> 此注解在方法是,注解自动添加到同步机制,生成的代码并不是直接锁方法,而是锁代码块
@Builder --> 建造者模式
@Delegate --> 代理模式
@Accessors -->链式风格,在调用set方法时,返回这个类的实例对象

官网备注
参考文档
非常全面的参考文档
Lombox常用注释
参考文档

@非空
在方法上使用@NonNull注解可以做非空判断,如果传入空值的话会直接抛出。

private String name;
    public setName(@NonNull String name){
    
        this.name = name;
    }

编译出来的效果:

public NonNullExample(@NonNull String name) {
    
        if (name == null) {
    
            throw new NullPointerException("name is marked non-null but is null");
        } else {
    
            this.name = name;
        }
    }

@Getter/@Setter
@Getter/@Setter注解自动生成getter/setter方法。
@Getter(lazy=true)
当我们获取某一个属性比较消耗资源时,可以给@Getter添加lazy=true属性实现懒加载,会生成Double Check Lock 样板代码对属性进行懒加载。

package bolen.example.pojo;

import lombok.Getter;
import lombok.Setter;

public class UserTwo {
    
    @Getter
    @Setter
    private int id;
    @Getter
    @Setter
    private String username;
    @Getter
    @Setter
    private String password;
}

在这里插入图片描述
当安装了Lombox插件和导入工具包后没有setter或getter方法的报错,也可以正常调用setter和getter方法。

@清理

@Cleanup
InputStream in = new FileInputStream(args);
@Cleanup
OutputStream out = new FileOutputStream(args);

OI流回自动关闭。不需要in.close()out.close()手动关闭。

@ToString
把所有类属性都编写到toString方法中方便打印日志。使用@ToString注解可以自动生成toString方法,默认会包含所有类属性,使用@ToString.Exclude注解可以排除属性的生成。

@ToString
public class ToStringExample {
    
    @ToString.Exclude
    private Long id;
    private String name;
    private Integer age;
    public ToStringExample(Long id,String name,Integer age){
    
        this.id =id;
        this.name = name;
        this.age = age;
    }

编译出来的效果:

public class ToStringExample {
    
    private Long id;
    private String name;
    private Integer age;

    public ToStringExample(Long id, String name, Integer age) {
    
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public String toString() {
    
        return "ToStringExample(name=" + this.name + ", age=" + this.age + ")";
    }
}

@ToString.Exclude注解可以排除属在toString方法中。

@XXX构造函数

@NoArgsConstructor:生成无参构造函数。
@RequiredArgsConstructor:生成包含必须参数的构造函数,使用@NonNull注解的类属性为必须参数。
@AllArgsConstructor:生成包含所有参数的构造函数。

@NoArgsConstructor
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor
public class ConstructorExample {
    
    @NonNull
    private Long id;
    private String name;
    private Integer age;
    /** ... */
}

@数据
@Data是一个方便使用的组合注解,是@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstructor的组合体。

@Data
public class DataExample {
    
    @NonNull
    private Long id;
    @EqualsAndHashCode.Exclude
    private String name;
    @EqualsAndHashCode.Exclude
    private Integer age;
}

编译出来的效果:

public class DataExample {
    
    @NonNull
    private Long id;
    private String name;
    private Integer age;

    public DataExample(@NonNull final Long id) {
    
        if (id == null) {
    
            throw new NullPointerException("id is marked non-null but is null");
        } else {
    
            this.id = id;
        }
    }

    @NonNull
    public Long getId() {
    
        return this.id;
    }

    public String getName() {
    
        return this.name;
    }

    public Integer getAge() {
    
        return this.age;
    }

    public void setId(@NonNull final Long id) {
    
        if (id == null) {
    
            throw new NullPointerException("id is marked non-null but is null");
        } else {
    
            this.id = id;
        }
    }

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

    public void setAge(final Integer age) {
    
        this.age = age;
    }

    public boolean equals(final Object o) {
    
        if (o == this) {
    
            return true;
        } else if (!(o instanceof DataExample)) {
    
            return false;
        } else {
    
            DataExample other = (DataExample)o;
            if (!other.canEqual(this)) {
    
                return false;
            } else {
    
                Object this$id = this.getId();
                Object other$id = other.getId();
                if (this$id == null) {
    
                    if (other$id != null) {
    
                        return false;
                    }
                } else if (!this$id.equals(other$id)) {
    
                    return false;
                }

                return true;
            }
        }
    }

    protected boolean canEqual(final Object other) {
    
        return other instanceof DataExample;
    }

    public int hashCode() {
    
        int PRIME = true;
        int result = 1;
        Object $id = this.getId();
        int result = result * 59 + ($id == null ? 43 : $id.hashCode());
        return result;
    }

    public String toString() {
    
        return "DataExample(id=" + this.getId() + ", name=" + this.getName() + ", age=" + this.getAge() + ")";
    }
}

@价值
使用@Value注解可以把类声明为不可变的,声明后此类相当于final类,无法被继承,其属性也会变成final属性。

@Value
public class ValueExample {
    
    private Long id;
    private String name;
    private Integer age;

    public static void main(String[] args) {
    
        //只能使用全参构造器
        ValueExample example = new ValueExample(1L,"test",20);
        // example.setName("andy") //没有生成setter方法,会报错
        // example.name="andy" //字段被设置为final类型,会报错
    }
}

编译出来的效果:

public final class ValueExample {
    
    private final Long id;
    private final String name;
    private final Integer age;

    public static void main(String[] args) {
    
        new ValueExample(1L, "test", 20);
    }

    public ValueExample(final Long id, final String name, final Integer age) {
    
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Long getId() {
    
        return this.id;
    }

    public String getName() {
    
        return this.name;
    }

    public Integer getAge() {
    
        return this.age;
    }
}

@SneakyThrows
使用@SneakyThrows注解的自动抛出异常。

public class SneakyThrowsExample {
    

    //自动抛出异常,无需处理
    @SneakyThrows(UnsupportedEncodingException.class)
    public static byte[] str2byte(String str){
    
        return str.getBytes("UTF-8");
    }

    public static void main(String[] args) {
    
        String str = "Hello World!";
        System.out.println(str2byte(str).length);
    }
}

编译出来的效果:

public class SneakyThrowsExample {
    
    public SneakyThrowsExample() {
    
    }

    public static byte[] str2byte(String str) {
    
        try {
    
            return str.getBytes("UTF-8");
        } catch (UnsupportedEncodingException var2) {
    
            throw var2;
        }
    }
}

@日志

@Log
public class LogExample {
    
    public static void main(String[] args) {
    
        log.info("level info");
        log.warning("level warning");
        log.severe("level severe");
    }
}

@Slf4j
使用Lombok生成日志对象时,根据使用日志实现的不同,有多种注解可以使用。比如@Log、@Log4j、@Log4j2、@Slf4j等。

. . .

相关推荐

额外说明

JVM详解(InsCode AI创作助手)

JVM是一个虚拟的计算机,它有自己的硬件架构,如处理器、堆栈和寄存器等,也有自己的指令系统。JVM的主要任务是负责加载、验证、编译和执行Java程序。 一、JVM参数默认配置如下 内存设置: 初始堆内存大小:物理内存的1/64 最大堆内存大小:物理内存的

额外说明

【华为电脑试题JAVA实现详解】-分数排名

 目录 一、题目描述 二、解题代码 一、题目描述 给定一些同学的信息(名字,成绩)序列,请你将他们的信息按照成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理。 例示: jack      70 peter     96 Tom    

额外说明

PostgreSQL、内存表、会话级内存表、pg_variables 在某些场景下,需要快速DML,并且数据可靠性要求不是很高。

PostgreSQL 内存表 作者 digoal 日期 2016-08-18 标签 PostgreSQL , 内存表 , 会话级内存表 , pg_variables 背景 在某些场景,要求快速的DML,并且对数据可靠性要求不是非常高。 例如游戏的会话信息

额外说明

APIAuto:敏捷开发最强大易用的 HTTP 接口工具,机器学习零代码测试、生成代码与静态检查、生成文档与光标悬浮注释,集 文档、测试、Mock、调试、管理 于一体的一站式体验。

敏捷开发最强大易用的 HTTP 接口工具,机器学习零代码测试、生成代码与静态检查、生成文档与光标悬浮注释。集 文档、测试、Mock、调试、管理 于一体的一站式体验,还有一键 格式化、注释/取消注释 等高效易用的快捷键。 在常用功能上远超 Postman,

额外说明

TP5+商城小程序——专题、分类、商品详情接口编写-分类商品接口编写

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技am

额外说明

​Linux操作系统渗透测试

任务环境说明: 服务器场景:Server2106(关闭链接) 服务器场景操作系统:Linux(版本不详) 1.通过本地PC中渗透测试平台Kali对服务器场景进行渗透测试,将该场景/var/www目录中唯一一个后缀为.bmp文件的文件名称作为Flag值提交

额外说明

41.登录注册小案例实现(使用Django中的form表单来进行用户输入数据的校验;文末附源码)

登录注册案例 1.登录注册第一步——创建模型生成数据表: (1)名为mucis的app下的models.py文件中创建: from django.db import models # Create your models here. class Us

额外说明

【Unity3D进阶4-15】Lua热更新

一、目录 【Unity3D从入门到进阶】文章目录及设置这个专栏的初衷 二、Lua简介 2-1、什么是Lua Lua 是一个小巧的脚本语言,巴西里约热内卢天主教大学里的一个研究小组于1993年开发,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩

额外说明

nginx 集成lua操作mysql

前言 lua是一夸小巧,灵活且高效的脚本语言,用标准C语言编写并以源代码形式开发,在很多业务场景下配合适当的设计,可以带来意想不到的效果; 举个常见的例子,现在几乎很多公司都会用到nginx作为代理服务器,假如现在有这么个需求,需要做黑名单过滤,或者在网

额外说明

闲聊spring源码一

概述 spring 版本6.0.12 ,整体概括 相关连接 阅读之前,可以浏览一下 spring相关文章 spring 对象初始化 以一个最简单对象初始化,没有依赖其它bean,就是最基础的pojo由spring初始化的过程 除去上图四个步骤,是不是和平

ads via 小工具