owenqing 联系🪐

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);
}
posted @   owenqing  阅读(148)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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工具
点击右上角即可分享
微信分享提示