文章目录
- 一些基本类上实用的注解及例子
- 一、@Data
- 二、@Accessors
- 三、@AllArgsConstructor
- 四、@NoArgsConstructor
- 五、@EqualsAndHashCode
- 六、后面在补充!先这样吧,哈哈!
- 总结
一些基本类上实用的注解及例子
一、@Data
@Data 注解是一个组合注解,它相当于同时使用了 @ToString, @EqualsAndHashCode, @Getter / @Setter 和 @RequiredArgsConstructor 这几个注解。也就是说,当你在一个类上使用 @Data 注解时,Lombok 会自动生成这个类的 toString 方法、equals 和 hashCode 方法,以及所有非 static 和非 transient 字段的 getter 和 setter 方法。
示例:
import lombok.Data;
@Data
public class User {
private String name;
private int age;
}
上述代码会自动生成 name 和 age 字段的 getter 和 setter 方法,以及 toString、equals 和 hashCode 方法。
二、@Accessors
@Accessors 注解用于配置字段的访问器的行为。当设置 chain = true 时,setter 方法会返回 this,这样就可以实现链式调用。
示例:
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class User {
private String name;
private int age;
}
使用上述代码,你可以这样链式地设置字段的值:
User user = new User().setName("Alice").setAge(30);
这样,你可以更简洁地编写代码,提高可读性,并减少出错的可能性。但请注意,链式调用并不总是最佳实践,它主要适用于某些特定的场景,比如构建器模式或者当你需要连续设置多个字段的值时。在其他情况下,使用传统的 setter 方法可能更为清晰。
三、@AllArgsConstructor
@AllArgsConstructor 注解用于生成一个包含类中所有字段的构造器。这在你需要为所有字段提供初始值时非常有用。
示例:
import lombok.AllArgsConstructor;
@AllArgsConstructor
public class User {
private String name;
private int age;
}
上述代码会自动生成以下构造器:
public User(String name, int age) {
this.name = name;
this.age = age;
}
四、@NoArgsConstructor
@NoArgsConstructor 注解用于生成一个无参数的构造器。如果你不希望为类中的任何字段提供初始值,或者字段已经有默认值(例如,基本类型或它们的包装类默认为 0 或 null),那么这个注解会非常有用。
示例:
import lombok.NoArgsConstructor;
@NoArgsConstructor
public class User {
private String name;
private int age;
}
上述代码会自动生成以下构造器:
public User() {
}
五、@EqualsAndHashCode
@EqualsAndHashCode(callSuper = false) 是 Lombok 库中的一个注解,用于自动生成一个类的 equals() 和 hashCode() 方法。这个注解对于确保对象在比较时能够正确识别其唯一性非常有用,特别是在集合(如 HashSet 或 HashMap)中存储对象时。
参数 callSuper 用于控制生成的 equals() 和 hashCode() 方法是否应该调用超类(父类)的相应方法。设置为 false 意味着不会调用超类的 equals() 或 hashCode() 方法。
具体解释如下:
callSuper = false:默认情况下,Lombok 生成的 equals() 和 hashCode() 方法不会考虑超类的字段。这意味着只有当前类中的字段会被用于比较和生成哈希码。这适用于那些不继承其他实体类或者其超类不包含重要识别信息的类。
如果你有一个类继承自另一个包含重要识别字段的类(比如一个基类包含了一个主键字段),你可能希望生成的 equals() 和 hashCode() 方法也考虑这些字段。在这种情况下,你应该将 callSuper 设置为 true。
@EqualsAndHashCode(callSuper = true)
public class ChildClass extends ParentClass {
private String someField;
// getters, setters, etc.
}
public class ParentClass {
private Long id;
// getters, setters, etc.
}
在上面的例子中,ChildClass 继承了 ParentClass,并且 ChildClass 使用了 @EqualsAndHashCode(callSuper = true)。这意味着当比较两个 ChildClass 对象是否相等时,不仅会考虑 someField 字段,还会考虑从 ParentClass 继承的 id 字段。同样地,生成的 hashCode() 方法也会基于这两个字段的值来计算哈希码。
总之,@EqualsAndHashCode(callSuper = false) 使得 Lombok 生成的 equals() 和 hashCode() 方法只考虑当前类中的字段,而不考虑从超类继承的任何字段。
六、后面在补充!先这样吧,哈哈!
总结
@作者:加辣椒了吗?
简介:憨批大学生一枚,喜欢在博客上记录自己的学习心得,也希望能够帮助到你们!