@Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode @JsonProperty这些注解的作用

这些注解来源于 Lombok 库,Lombok 是一个 Java 库,它通过注解来帮助开发者减少样板代码的编写,从而提高开发效率和代码整洁度。以下是这些注解的具体作用:

1. @Data

@Data 是一个组合注解,它包含了以下常用注解的功能:

  • @ToString:生成一个 toString 方法,用于打印对象的字段值。
  • @EqualsAndHashCode:生成 equalshashCode 方法,用于对象之间的比较和散列码的生成。
  • @Getter:为所有字段生成 getter 方法。
  • @Setter:为所有字段生成 setter 方法。
  • @RequiredArgsConstructor:为所有 final 字段生成一个构造函数。
@Data
public class User {
    private String name;
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5

相当于手动编写了以下代码:

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

    // Getter methods
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    // Setter methods
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    // toString method
    @Override
    public String toString() {
        return "User(name=" + name + ", age=" + age + ")";
    }

    // equals and hashCode methods
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return age == user.age && Objects.equals(name, user.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

2. @NoArgsConstructor

@NoArgsConstructor 生成一个无参构造函数。

@NoArgsConstructor
public class User {
    private String name;
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5

相当于:

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

    public User() {}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3. @AllArgsConstructor

@AllArgsConstructor 生成一个包含所有字段的构造函数。

@AllArgsConstructor
public class User {
    private String name;
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5

相当于:

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

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

4. @EqualsAndHashCode(callSuper = true)

@EqualsAndHashCode 生成 equalshashCode 方法。callSuper = true 选项表示生成的 equalshashCode 方法中会调用父类的 equalshashCode 方法。

@EqualsAndHashCode(callSuper = true)
public class User extends BaseUser {
    private String name;
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5

相当于:

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        if (!super.equals(o)) return false;
        User user = (User) o;
        return age == user.age && Objects.equals(name, user.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(super.hashCode(), name, age);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

总结

这些 Lombok 注解通过减少样板代码的编写,使代码更加简洁且易于维护。根据项目需求和个人偏好选择合适的注解使用,可以显著提升开发效率。在使用这些注解时,切记确保团队成员对 Lombok 工具的理解一致,避免因为对注解生成的代码不清楚而导致潜在问题。

如果属性名存在大写字母,怎么设置

在 Java 中,属性名通常遵循 小驼峰命名法(lower camel case),即第一个单词的小写字母,后续单词的首字母大写。但有时您可能会遇到属性名中包含大写字母的情况,例如在与某些 JSON API 交互时。

如果您使用Lombok并希望在包含大写字母的属性名上正确生成 gettersetter 方法,则需要使用 @Accessors 注解来定制 gettersetter 的生成。此外,如果您希望 JSON 序列化/反序列化时能够正确处理包含大写字母的字段名,可以结合使用 Jackson 或 Gson 等库的注解。

示例代码

下面是一个如何处理属性名中包含大写字母的例子:

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.experimental.Accessors;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true) // 支持链式调用
public class User {
    
    private String firstName; // 第一属性
    private String lastName;  // 第二属性
    private String UserName;  // 包含大写字母的属性

    // 如果需要支持JSON序列化/反序列化,可以使用Jackson等库的注解
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

JSON 处理

如果使用 Jackson,您可以在属性上添加 @JsonProperty 注解,以确保 JSON 序列化/反序列化时能够正确识别。例如:

import com.fasterxml.jackson.annotation.JsonProperty;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class User {
    
    @JsonProperty("firstName")
    private String firstName;

    @JsonProperty("lastName")
    private String lastName;
    
    @JsonProperty("UserName")
    private String userName;  // 这里的 userName 可以映射成 UserName
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

如何处理大写字母的属性名

  1. 使用小写: 如果没有特别的约定,可以尽量避免使用大写字母作为属性名,以符合 Java 的命名规范。
  2. 使用注解: 利用 Lombok 的 @Accessors 和其他依赖注解(如 Jackson 的 @JsonProperty)来管理命名不一致的问题。
  3. 命名规范: 保持代码的一致性尤为重要,确保团队对命名约定有清晰的共识。

总结

如果属性名称中包含大写字母,您可以使用 Lombok 的 @Accessors 注解,以及在实现 JSON 序列化和反序列化时使用 @JsonProperty 注解。这些措施确保了代码的可读性和与外部 API 交互时的兼容性。