Lombok @Accessors链式编程+注解使用
Lombok使用及注解详解
Lombok依赖和插件的关系:
依赖中被你调用过的函数会与你的代码一起进行编译。对于插件来说呢,比如有些插件是帮助你进行编译工作的,你不用手动写。比如lombok依赖是为了方便用里面的注解@Data等,lombok插件是为了编译这些注解的,识别这些注解。
Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码。仅五个字符(@Data)就可以替换数百行代码从而产生干净,简洁且易于维护的Java类。但是优缺点很明显

使用步骤:
1.在IDEA中安装Lombok插件

2.在项目中导入lombok的jar包
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
3、lombok的所有注解
常用注解
Lombok是一个Java库,它提供了一组注解,用于减少Java代码中的样板代码(boilerplate code)。以下是一些常用的Lombok注解:
- @Getter和@Setter: 自动生成类的Getter和Setter方法,可以应用于字段或类级别。
- @ToString: 自动生成
toString()方法,包括类的所有字段。 - @EqualsAndHashCode: 自动生成
equals()和hashCode()方法,基于类的所有非静态、非transient字段。 - @NoArgsConstructor: 自动生成无参构造函数。
- @RequiredArgsConstructor: 自动生成包含必填字段的构造函数。
RequiredArgsConstructor是什么?
Lombok中的一个@RequiredArgsConstructor,简化了一些@Autowired注解,主要的功能就是可以减少@Autowired的书写,我们在写controller或者Service层的时候,需要注入很多的mapper接口或者另外的service接口,这时候就会写很多的@Autowired注解,代码看起来很繁琐。总结:类上加上@RequiredArgsConstructor,需要注入的类要用final声明。
- @AllArgsConstructor: 自动生成包含所有字段的构造函数。
- @Data: 结合@Getter、@Setter、@ToString、@EqualsAndHashCode和@AllArgsConstructor的功能,提供了一个全能注解,适用于数据类。
- @Builder: 自动生成Builder模式的构造器,允许使用链式调用来创建对象。
- @Value: 与@Data类似,但生成的类是不可变的(immutable)。
- @Slf4j: 自动生成SLF4J的日志记录器(Logger)。
- @Log: 自动生成其他日志记录器,如java.util.logging或Apache Log4j。
- @Cleanup: 自动生成资源关闭语句,通常用于自动关闭流或数据库连接。
- @SneakyThrows: 将受检异常转换为未受检异常,使得在方法中可以抛出受检异常而无需在方法签名中声明。
- @NonNull: 标记字段或参数为非空,Lombok会生成相应的null检查代码。
- @Value.Immutable: 用于生成不可变的值对象,结合了@Value和@Builder的特性。
@EqualsAndHashCode 注解:
1. 此注解会生成equals(Object other) 和 hashCode()方法。
2. 它默认使用非静态,非瞬态的属性
3. 可通过参数exclude排除一些属性
4. of 用来指明你要用什么字段来重写equals和hashcode
5. 它默认仅使用该类中定义的属性且不调用父类的方法
6. 可通过callSuper=true解决上一点问题。让其生成的方法中调用父类的方法。callSuper 这个选项只能用在有父类情况下,如上图如果没有Father那么会报错。默认是false,当改成true后,会调用父类的equals方法通过官方文档,可以得知,当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且默认不会使用父类的属性,这就导致了可能的问题。
比如,有多个类有相同的部分属性,把它们定义到父类中,恰好id(数据库主键)也在父类中,那么就会存在部分对象在比较时,它们并不相等,却因为lombok自动生成的equals(Object other) 和 hashCode()方法判定为相等,从而导致出错。修复此问题的方法很简单:
1. 使用@Getter @Setter @ToString代替@Data并且自定义equals(Object other) 和 hashCode()方法,比如有些类只需要判断主键id是否相等即足矣。
2. 或者使用在使用@Data时同时加上@EqualsAndHashCode(callSuper=true)注解。
举例:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private String password;
}



Lombok @Accessors链式编程
最近看到代码里面有@Accessors注解,看了一些文章没理解,这个一看就能懂:
@Accessors(chain=true)
链式访问,该注解设置chain=true,生成setter方法返回this(也就是返回的是对象),代替了默认的返回void。
package com.pollyduan;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain=true)
public class User {
private Integer id;
private String name;
private Integer age;
public static void main(String[] args) {
//开起chain=true后可以使用链式的set
User user=new User().setAge(31).setName("pollyduan");//返回对象
System.out.println(user);
}
}
@Accessors(fluent = true)
与chain=true类似,区别在于getter和setter不带set和get前缀。
package com.pollyduan;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(fluent=true)
public class User {
private Integer id;
private String name;
private Integer age;
public static void main(String[] args) {
//fluent=true开启后默认chain=true,故这里也可以使用链式set
User user=new User().age(31).name("pollyduan");//不需要写set
System.out.println(user);
}
}
@Accessors(prefix = "f")
set方法忽略指定的前缀。不推荐大神们这样去命名。
package com.pollyduan;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(prefix = "f")
public class User {
private String fName = "Hello, World!";
public static void main(String[] args) {
User user=new User();
user.setName("pollyduan");//注意方法名
System.out.println(user);
}
}
更多推荐
所有评论(0)