Files
Knowledge/0 编程/java/lombok常用注解+65e85a26-7c15-48ca-bf93-551479e7b9a2.md

165 lines
4.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[Lombok](https://so.csdn.net/so/search?q=Lombok&spm=1001.2101.3001.7020)是一个Java库,它通过注解的方式来简化Java代码的编写。
## 1、Lombok库中常用的注解
@Getter:自动生成gette[r方](https://so.csdn.net/so/search?q=r%E6%96%B9&spm=1001.2101.3001.7020)法。
@Setter:自动生成setter方法。
@ToString:自动生成[toString方法](https://so.csdn.net/so/search?q=toString%E6%96%B9%E6%B3%95&spm=1001.2101.3001.7020)。
@EqualsAndHashCode:自动生成equals和hashCode方法。
@NoArgsConstructor:自动生成无参构造方法。
@AllArgsConstructor:自动生成全参构造方法。
@Data:自动生成getter、setter、equals、hashCode和toString方法。
@Builder:自动生成Builder模式的代码。
```TypeScript
User user = User.builder()
.name("Tom")
.age(20)
.isVip(true)
.build();
12345
```
@Slf4j:自动生成log变量,可以使用log.info()等方法输出日志。
@NonNull:标注在参数上,生成非空检查代码。
@Cleanup:自动生成try-finally代码块,用于自动关闭流等资源。
@Synchronized:自动生成同步代码块。
以上是Lombok库中常用的注解,使用这些注解可以大大简化Java代码的编写,减少了代码的冗余。
@Accessors
@Accessors(chain=true)
链式访问,该注解设置chain=true,生成setter方法返回this(也就是返回的是对象),代替了默认的返回void。
```TypeScript
@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);
}
}
1234567891011121314
```
@Accessors(fluent = true)
与chain=true类似,区别在于getter和setter不带set和get前缀。
```TypeScript
@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);
}
}
1234567891011121314
```
@Accessors(prefix = “f”)
set方法忽略指定的前缀。不推荐大神们这样去命名。
```TypeScript
@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);
}
}
123456789101112
```
## 2、@ToString注解可能引起的问题
ToString可能会引起堆栈溢出,
1、当存在如下两个相互依赖的类时,并且使用了@ToString注解
```TypeScript
@Getter
@Setter
@ToString
public class User implements Serializable {
private Person person;
}
123456
```
```TypeScript
@Getter
@Setter
@ToString
public class Person implements Serializable {
private User user;
}
123456
```
2、两个对象相互依赖的情况下,并且调用了toString()方法。会无限递归调用tostring方法,且创建字符串造成内存溢出。
```TypeScript
public static void main(String[] args) throws InterruptedException {
Person person = new Person();
User user = new User();
person.setUser(user); // 只要任意一个引用为空,就不会内存溢出(例如:person.setUser(null))
user.setPerson(person);
System.out.println(user.toString()); // 要调用tostring方法才会无限递归
}
1234567
```
因此在使用@ToString和@Data的时候要注意这种情况。
可以使用@ToString.Exclude注解来防止无限递归
```TypeScript
@ToString.Exclude
private Person person;
12
```
## 3、@Data注解可能引起的问题
Lombok中的@Data注解是一个方便的注解,可以自动生成getter、setter、equals、hashCode和toString方法,简化了Java代码的编写。但是,如果使用不当,可能会出现以下问题:
- toString()方法可能引发无限递归:当一个类中的属性是另一个类的对象时,如果两个类都使用了@Data注解,就会出现toString()方法的无限递归,导致栈溢出。可以通过使用@ToString.Exclude注解来排除不需要在toString()方法中输出的属性。(上面已讲)
- 可能会降低代码的可读性:虽然@Data注解可以大大简化Java代码的编写,但是有时候自动生成的代码可能会比较复杂,降低了代码的可读性。可以根据实际情况选择使用@Data注解或手动编写getter、setter、equals、hashCode和toString方法。