【Java基础系列】Lombok常用注解

简介: Lombok是一款在java开发中简洁化代码十分有用的插件工具,lombok提供了很多注解,在编译时候生成java代码,代替了手工编写一些简单的代码,使程序员可以关注更重要的实现。

H@I92%9$0GJROL@O7@NCXDL.jpg

主要讲解Lombok几个常用的基本注解的使用。

最近工作中看到很多这种注解,就统一梳理一下,看一下相关的注解有哪些,便于应用到项目中。


前言


Lombok是一款在java开发中简洁化代码十分有用的插件工具,lombok提供了很多注解,在编译时候生成java代码,代替了手工编写一些简单的代码,使程序员可以关注更重要的实现。


插件配置


在使用lombok插件的时候,还要进行添加lombok的Maven依赖,代码示例:

<!--lombok 注解-->
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.16.10</version>
</dependency>


@Data注解


在JavaBean或类JavaBean中使用,这个注解包含范围最广,它包含getter、setter、NoArgsConstructor、equals、canEqual、hashCode、toString注解,即当使用当前注解时,会自动生成包含的所有方法。

  • @getter注解:在JavaBean或类JavaBean中使用,使用此注解会生成对应的getter方法;
  • @setter注解:在JavaBean或类JavaBean中使用,使用此注解会生成对应的setter方法;
  • @NoArgsConstructor注解:在JavaBean或类JavaBean中使用,使用此注解会生成对应的无参构造方法;
  • @ToString注解:在JavaBean或类JavaBean中使用,使用此注解会自动重写对应的toStirng方法;
  • @EqualsAndHashCode注解:在JavaBean或类JavaBean中使用,使用此注解会自动重写对应的equals方法和hashCode方法;


@getter、@setter

可以为相应的属性自动生成Getter/Setter方法:

@Setter
@Getter
public class Test1 {
    private Integer id;
    private String name;
    private Integer age;
    public static void main(String args[]) {
        Test1 test = new Test1();
        test.setId(1);
        test.setAge(18);
        test.setName("楼仔");
        System.out.println("id:" + test.getId());
        System.out.println("name:" + test.getName());
        System.out.println("age:" + test.getAge());
    }
}
// 输出:
// id:1
// name:楼仔
// age:18


@toString

会生成一个toString()方法,默认情况下,会输出类名、所有属性(会按照属性定义顺序),用逗号来分割。

@Setter
@Getter
@ToString
public class Test1 {
    private Integer id;
    private String name;
    private Integer age;
    public static void main(String args[]) {
        Test1 test = new Test1();
        test.setId(1);
        test.setAge(18);
        test.setName("楼仔");
        System.out.println("toString:" + test.toString());
    }
}
// 输出:
// toString:Test1(id=1, name=楼仔, age=18)


@EqualsAndHashCode

使用此注解会自动重写对应的equals方法和hashCode方法。

@Setter
@EqualsAndHashCode
public class Test1 {
    private Integer id;
    private String name;
    private Integer age;
    public static void main(String args[]) {
        Test1 test = new Test1();
        Test1 test1 = test;
        Test1 test2 = new Test1();
        System.out.println("test equals test1:" + test.equals(test1));
        System.out.println("test equals test2:" + test.equals(test2));
        System.out.println("hashCode test:" + test.hashCode());
        System.out.println("hashCode test1:" + test1.hashCode());
        System.out.println("hashCode test2:" + test2.hashCode());
    }
}
// 输出:
// test equals test1:true
// test equals test2:true
// hashCode test:357642
// hashCode test1:357642
// hashCode test2:357642


@Data

当使用@Data时,会包含getter、setter、NoArgsConstructor、equals、canEqual、hashCode、toString这些注解。

@Data
public class Test2 {
    private Integer id;
    private String name;
    private Integer age;
    public static void main(String args[]) {
        Test2 test = new Test2();
        test.setId(1);
        test.setAge(18);
        test.setName("楼仔");
        System.out.println("id:" + test.getId());
        System.out.println("name:" + test.getName());
        System.out.println("age:" + test.getAge());
        System.out.println("toString:" + test.toString());
        Test2 test1 = test;
        Test2 test2 = new Test2();
        System.out.println("test equals test1:" + test.equals(test1));
        System.out.println("test equals test2:" + test.equals(test2));
        System.out.println("hashCode test:" + test.hashCode());
        System.out.println("hashCode test1:" + test1.hashCode());
        System.out.println("hashCode test2:" + test2.hashCode());
    }
}
// 输出:
// id:1
// name:楼仔
// age:18
// toString:Test2(id=1, name=楼仔, age=18)
// test equals test1:true
// test equals test2:false
// hashCode test:50789814
// hashCode test1:50789814
// hashCode test2:357642


其它常用注解


@NoArgsConstructor

@NoArgsConstructor在类上使用,它可以提供一个无参构造器,比如:

@NoArgsConstructor
public class Test3 {
    private String name;
    private Integer age;
}
// 编译后:
public class Test3 {
    private String name;
    private Integer age;
    public Test3() {}
}

当然,有时候我们会使用到单例模式,这个时候我们需要将构造器私有化,那么就可以使用这样一个属性access设置构造器的权限:

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class Test3 {
    private String name;
    private Integer age;
}
// 编译后:
public class Test3 {
    private String name;
    private Integer age;
    private Test3() {}
}

当类中有final字段没有被初始化时,编译器会报错:

可用@NoArgsConstructor(force = true),那么Lombok就会为没有初始化的final字段设置默认值 0 / false / null, 这样编译器就不会报错:


@RequiredArgsConstructor

这个注解可以生成带参或者不带参的构造方法。若带参数,只能是类中所有带有 @NonNull注解的和以final修饰的未经初始化的字段,如下所示:

@RequiredArgsConstructor
@ToString
public class Test4 {
    private Integer id;
    private final String name;
    @NonNull
    private Integer age;
    public static void main(String args[]) {
        Test4 test = new Test4("楼仔", 18);
        System.out.println("toString:" + test.toString());
    }
}
// 输出:
// toString:Test4(id=null, name=楼仔, age=18)


@AllArgsConstructor

该注解提供一个全参数的构造方法,默认不提供无参构造。需要注意的是,这里的全参不包括已初始化的final字段(主要是final字段,一旦被赋值不允许再被修改)。

@AllArgsConstructor
@ToString
public class Test5 {
    private Integer id;
    private final String name = "楼仔";
    private Integer age;
    public static void main(String args[]) {
        Test5 test = new Test5(1,18);
        System.out.println("toString:" + test.toString());
    }
}
// 输出:
// toString:Test5(id=1, name=楼仔, age=18)


@Builder

这个是我最近使用注解时,最喜欢的一个注解,保证让你用完一次后,就会爱上她!之前在文章《设计模式系列3-builder模式》讲解过这种设计模式,现在直接一个@Builder注解就能搞定,直接上代码:

@Builder
@Data
public class Test6 {
    private Integer id;
    private String name;
    private Integer age;
    public static void main(String args[]) {
        Test6 test = Test6.builder().
                id(1).
                name("楼仔").
                age(18).build();
        System.out.println("toString:" + test.toString());
    }
}
// 输出:
// toString:Test6(id=1, name=楼仔, age=18)

一个字,爽~~~


后记


对于Lombok,常用的注解可能还有一些,但是上面梳理的这些注解,是我近1-2周经常遇到的,如果后续还有使用频率比较高的Lombok相关的注解,我再总结一下。

相关文章
|
1月前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
71 7
|
3月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
113 43
Java学习十六—掌握注解:让编程更简单
|
1月前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
90 5
|
2月前
|
Java 开发者 Spring
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
86 14
|
3月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
107 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
4月前
|
Java
lombok的使用
本文介绍了Lombok库的基本使用方法和常用注解,通过示例代码展示了如何使用Lombok简化Java对象的创建、属性访问、日志记录等编码工作,使代码更加简洁。
lombok的使用
|
2月前
|
Java 编译器
Java进阶之标准注解
Java进阶之标准注解
49 0
|
3月前
|
JSON Java 数据库
java 常用注解大全、注解笔记
关于Java常用注解的大全和笔记,涵盖了实体类、JSON处理、HTTP请求映射等多个方面的注解使用。
61 0
java 常用注解大全、注解笔记
|
4月前
|
Java 编译器 程序员
Java注解,元注解,自定义注解的使用
本文讲解了Java中注解的概念和作用,包括基本注解的用法(@Override, @Deprecated, @SuppressWarnings, @SafeVarargs, @FunctionalInterface),Java提供的元注解(@Retention, @Target, @Documented, @Inherited),以及如何自定义注解并通过反射获取注解信息。
Java注解,元注解,自定义注解的使用
|
3月前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
32 0