lombok 注解使用
一、安装 lombok
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
二、注解
2.1 构造函数注解
// 无参构造函数
@NoArgsConstructor
// 包含所有属性的构造函数
@AllArgsConstructor
// @NonNull 标记的必须构造中初始化
// final 标记的必须在构造函数中初始化
@RequiredArgsConstructor
public class Student {
@NonNulls
private Integer id;
private String name;
private Integer age;
}
/**
* 访问限制,private 外部不能访问,构造单例类比较有用
* @AllArgsConstructor(access = AccessLevel.PRIVATE)
*/
2.2 Getter Setter
@Getter @Setter
public class Student {
private String name;
// 访问限制,设置成 None 表示不生成 Setter
// Getter 同理
@Setter(value = AccessLevel.NONE)
private Integer age;
}
2.3 ToString
// ToString 常用属性
// @ToString(of = {"name", "id"}) 打印的参数
// @ToString(exclude = {"age"}) 排除的参数
// @ToString(callSuper = true) 调用父类的 toString 方法
@ToString(of = {"name"})
@AllArgsConstructor
public class Student {
private Integer id;
private String name;
private Integer age;
}
public static void main(String[] args) {
Student stu = new Student(123, "Jade", 21);
System.out.println(stu);
}
// 输出
// Student(name=Jade)
2.4 EqualsAndHashCode
- equals 判断对象地址是否相等
- hashCode 根据成员变量进行 hash 操作
- 两个相同的对象,hashCode 一定相等
- 两个不同的对象,hashCode 尽量不要相等
/**
* 观察 hashCode 的生成
*/
public class Car {
public String brand;
public Double maxSpeed;
pbblic Integer maxLoad;
@Override
int hashCode() {
return Objects.hash(brand, maxSpeed, maxLoad);
}
}
// lombok 重写 Equals 与 hashCode
// equals hashCode 一般成对出现
// 只使用 id 生成 hashCode
@EqualsAndHashCode(of = {"id"})
public class Student {
private Ingeter id;
private String name;
private Integer age;
}
2.5 Data
Data 注解相当于很多个注解的合集
// @Data 注解相当于
// @Getter @Setter @ToString @EqualsAndHashCode 几个注解的合集
@Data
public class Student {
private Integer id;
private String name;
private Integer age;
}
// 注意这里 @Data 是通过所有属性实现 Equals hashCode 的
// 如果需要自定义重写请在加一层
@Data
@EqualsAndHashCode(of = {"id"})
public class Student {
...
}
2.6 Accessors
链式调用,Accessors 需要基于 @Getter @Setter 或 @Data 注解
// 链式
@NoArgsConstrutor
@Getter @Setter
@Accessors(chan = true) // 默认为 false
public class Student {
private Integer id;
private String name;
private Integer age;
}
// fluent
@NoArgsConstrutor
@Getter @Setter
@Accessors(fluent = true) // 默认为 false
public class Student {
private Integer id;
private String name;
private Integer age;
}
// fluent 比 chan 少了 setXxx
public static void main(String[] args()) {
Student stu = new Student();
// 链式操作
stu.setId(123).setName("Jade").setAge(21);
// fluent 直接使用名字
stu.id(123).name("Jade").age(21);
System.out.println(stu);
}
2.7 Builder 建造者设计模式
一般 java 为了解决默认参数的问题会使用建造者模式
@Builder
public class Student {
private Integer id;
private String name;
private Integer age;
}
public static void main(String[] args) {
// 建造者模式
Student.StudentBuilder stuBuilder = Student.builder();
Student student = stuBuilder
.id(123)
.name("Jade")
.age(21)
.build();
}
2.8 @Log @Slf4j 简化日志操作
先安装 log4j (slf4j)
java 常用的两个日志库 log4j logback
<!-- slf4j api 及其实现 log4j -->
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
log4j 配置参考 resources/log4j.properties
log4j.rootLogger=INFO,stdout
# display in console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold=debug
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss} [%t\:%r] - [%p] %m%n
未使用注解简化需要在类中初始化 LOGGER
// 未使用注解
public class StudentService {
private static final Logger LOGGER = LoggerFactory.getLogger(StudentService.class);
public ArrayList<Student> getAllStudents() {
LOGGER.error("getAllStudents error mark");
ArrayList<Student> students = new ArrayList<>();
students.add(new Student(123, "Jade", 21));
return students;
}
}
使用 @Slf4j @Log4j @Log4j2
@Slf4j
public class StudentService {
public ArrayList<Student> getAllStudents() {
ArrayList<Student> students = new ArrayList<>();
students.add(new Student(123, "Jade", 21));
// 使用注解后的打印日志的方式
log.info("getAllStudent log mark");
return students;
}
}
2.9 var val
var 变量自动推导类型
val 不可变
import lombok.var;
public static void main(args String[]) {
var student = new Student(25, "Jade", 21);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具