@ToString注解有下面几个属性
- includeFieldNames是指toString方法中是否包含属性名
- exclude是指toString方法中排除指定属性
- of属性是指定哪些实体类的属性组成toString方法,如果of和exclude同时存在,of的优先级大于exclude
- callSuper()是指是否调用父类的toString方法
- doNotUseGetters设置是否使用getter方法来获取属性值
修改Sku类上@toString注解为
@ToString( includeFieldNames = false, exclude = {"skuId"}, of = {"skuId"} ) 复制代码
再次编译,查看编译后的文件,方法中不现实属性名,而且of和exclude冲突的情况下,exclude指定的属性会被忽略
修改@ToString注解属性为
@ToString( includeFieldNames = false, exclude = {"skuId"}, of = {"skuId","skuPrice"}, doNotUseGetters = false ) 复制代码
手动给Sku增加 skuPrice的get方法,并增加打印语句
public Double getSkuPrice() { System.out.println("getter方法被调用"); return skuPrice; } 复制代码
增加测试方法
@Test public void test(){ Sku sku = new Sku(); sku.setSkuPrice(101.0); System.out.println(sku.toString()); } 复制代码
执行测试
@EqualsAndHashCode
作用在类上,在Sku类上增加该注解,并重新编译Sku类,查看编译后的文件
同样包含一些属性,用法与@ToString、@Getter、@Setter包含的属性用法一致
@Data注解
大而全的注解,包含了四种注解@Getter、@Setter、@ToString、@EqualsAndHashCode 新建一个Product类
@Data public class Product { private Integer productId; private String productName; private Double productPrice; } 复制代码
编译Product类,查看编译后的文件
包含了getter、setter、toString、equals和hashCode五个方法
@Val
弱语言变量,可以接受任何类型的参数
在Product方法中增加构造函数,使用val定义变量并接受不同类型的数据
public Product(){ val productName = "Cell Phone"; val productPrice = 100.0; val productList = new ArrayList<Product>(); productList.add(new Product()); } 复制代码
重新编译Product类,查看编译后的文件定义变量都被正确赋值类型
@NotNull
非空检查,可以作用于构造函数的参数中
public Product(@NonNull String productName){ System.out.println(productName); } 复制代码
重新编译Product类,查看编译后的文件
增加了对productName的非空判断
@AllArgsConstructor、@NoArgsConstructor、@RequiredArgsConstructor
@AllArgsConstructor、@NoArgsConstructor可以生成包含全部属性的构造方法和空参构造方法,@RequiredArgsConstructor则可以根据属性生成构造方法
在entity包增加Category类,并增加@AllArgsConstructor、@NoArgsConstructor注解
@AllArgsConstructor @NoArgsConstructor public class Category { private Integer categoryId; private String categoryName; } 复制代码
编译Category类,查看编译后的文件,自动生成了有参数和无参数的构造方法
将Category类的@AllArgsConstructor、@NoArgsConstructor注解注释,将Category类修改为
@RequiredArgsConstructor public class Category { private final Integer categoryId; @NonNull private String categoryName; private Category category; } 复制代码
将categoryName属性设置为NonNull,将categoryId设置为常量,实例化Category类时这两个参数必传,增加@RequiredArgsConstructor,重新编译Category类
@RequiredArgsConstructor根据属性生成了包含categroyId和categoryName两个属性的构造方法
五、 Lombok总结
Lombok优点:
- 通过注解自动生成样板代码,提高开发效率
- 代码简洁,只需要关注属性即可
- 新增或者修改属性,无需修改相关方法
Lombok缺点:
- 降低源代码的可读性和完整性
- 增加了问题排查的难度
- 需要IDE的插件支持