Lombok库中生成不同构造方法的注解


Lombok库中生成构造方法的注解

在 Java 中,生成构造方法的注解主要来自 Lombok 库(最常用)和其他一些框架。

以下是详细的分类说明:


一、Lombok 注解(最常用)

Lombok 在编译时自动生成代码,无需手动编写构造方法。

1. 无参构造方法

@NoArgsConstructor
public class User {
    private String name;
    private int age;
}

编译后生成:

public User() {}

2. 全参构造方法

@AllArgsConstructor
public class User {
    private String name;
    private int age;
}

编译后生成:

public User(String name, int age) {
    this.name = name;
    this.age = age;
}

3. 必选参数构造方法

@RequiredArgsConstructor
public class User {
    private final String id;  // final 字段必选
    @NonNull private String name; // @NonNull 字段必选
    private int age;         // 普通字段不包含
}

编译后生成:

public User(String id, String name) {
    if (name == null) throw new NullPointerException("name is marked non-null");
    this.id = id;
    this.name = name;
}

4. Builder 模式构造

@Builder
public class User {
    private String name;
    private int age;
}

可通过链式调用创建对象:

User user = User.builder().name("Tom").age(25).build();
List<User> list= Arrays.asList(
                User.builder().id(1L).userName("java").userAccount("java").build(),
                User.builder().id(2L).userName("张三").userAccount("25").build(),
                User.builder().id(3L).userName("李四").userAccount("30").build(),
                User.builder().id(4L).userName("王五").userAccount("33").build()
        );

二、其他框架的构造方法注解

1. JPA/Hibernate - @Entity

实体类默认需要无参构造器(隐式生成):

@Entity
public class User {
    @Id
    private Long id;
    private String name;
    
    // 即使不写,JPA 运行时也会通过反射调用无参构造器
}

2. Jackson JSON 反序列化 - @JsonCreator

用于自定义构造方法处理 JSON:

public class User {
    private String name;
    private int age;

    @JsonCreator
    public User(@JsonProperty("name") String name, 
                @JsonProperty("age") int age) {
        this.name = name;
        this.age = age;
    }
}

3. Immutable 对象库

如 Google AutoValue 或 Immutables:

@AutoValue
public abstract class User {
    abstract String name();
    abstract int age();

    // 自动生成全参构造方法
    public static User create(String name, int age) {
        return new AutoValue_User(name, age);
    }
}

三、对比总结

注解类型注解作用使用场景
Lombok@NoArgsConstructor生成无参构造方法POJO/DTO 类
@AllArgsConstructor生成全参构造方法需要快速初始化所有字段
@RequiredArgsConstructor生成 final/@NonNull 字段构造必选参数场景
@Builder生成 Builder 模式构造复杂对象创建
JPA/Hibernate@Entity (隐式)要求有无参构造器数据库实体类
Jackson@JsonCreator自定义 JSON 反序列化构造特殊格式 JSON 解析
Immutable 框架@AutoValue自动生成不可变类构造线程安全/值对象

四、使用示例(Lombok 综合版)

@Data // 生成 getter/setter/toString/equals/hashCode
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String name;
    private int age;
}

等价于手动编写 120+ 行代码!


五、注意事项

  1. Lombok 需安装插件

    • IDE 需装 Lombok 插件(IntelliJ/Eclipse)

    • Maven/Gradle 需添加依赖:

      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.18.28</version>
          <scope>provided</scope>
      </dependency>
      
  2. JPA 实体类要求

    • 必须有无参构造器(@NoArgsConstructor
    • 构造器访问权限至少为 protected
  3. Builder 模式覆盖默认构造

    • 使用 @Builder 后,默认无参构造器会被覆盖
    • 需显式添加 @NoArgsConstructor@AllArgsConstructor

推荐优先使用 Lombok,可减少 30% 以上的样板代码!

JAVA-技能点
知识点
Java注解