Lombok 骑猪看日落 2022-06-02 00:45 243阅读 0赞 ### https://www.jianshu.com/p/365ea41b3573 ### ### Lombok简介\#\#\# ### Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。官方地址:[https://projectlombok.org/][https_projectlombok.org],github地址:[https://github.com/rzwitserloot/lombok][https_github.com_rzwitserloot_lombok]。 ### IntelliJ IDEA 使用它的方法\#\#\# ### * 先安装插件 ![Image 1][] * 然后引入lombok的jar包 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.14</version> </dependency> ### 注解的介绍\#\#\# ### [官方注解介绍][Link 1] * ###### @Getter and @Setter\#\#\#\#\#\# ###### 你可以用@Getter / @Setter注释任何字段,让lombok自动生成默认的getter / setter方法。 默认生成的方法是public的,如果要修改方法修饰符可以设置**AccessLevel**的值,例如:***@Getter(access = AccessLevel.PROTECTED)*** ![Image 1][] Paste\_Image.png import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; public class User { @Getter(AccessLevel.PROTECTED) @Setter private Integer id; @Getter @Setter private String name; @Getter @Setter private String phone; } * ###### @ToString\#\#\#\#\#\# ###### 生成toString()方法,默认情况下,它会按顺序(以逗号分隔)打印你的类名称以及每个字段。可以这样设置不包含哪些字段***@ToString(exclude = "id")*** / ***@ToString(exclude = \{"id","name"\})*** 如果继承的有父类的话,可以设置**callSuper** 让其调用父类的toString()方法,例如:***@ToString(callSuper = true)*** import lombok.ToString; @ToString(exclude = {"id","name"}) public class User { private Integer id; private String name; private String phone; } 生成toString方法如下: public String toString(){ return "User(phone=" + phone + ")"; } * ###### @EqualsAndHashCode\#\#\#\#\#\# ###### 生成hashCode()和equals()方法,默认情况下,它将使用所有非静态,非transient字段。但可以通过在可选的exclude参数中来排除更多字段。或者,通过在parameter参数中命名它们来准确指定希望使用哪些字段。 @EqualsAndHashCode(exclude={"id", "shape"}) public class EqualsAndHashCodeExample { private transient int transientVar = 10; private String name; private double score; private Shape shape = new Square(5, 10); private String[] tags; private transient int id; public String getName() { return this.name; } @EqualsAndHashCode(callSuper=true) public static class Square extends Shape { private final int width, height; public Square(int width, int height) { this.width = width; this.height = height; } } } 对比代码如下: import java.util.Arrays; public class EqualsAndHashCodeExample { private transient int transientVar = 10; private String name; private double score; private Shape shape = new Square(5, 10); private String[] tags; private transient int id; public String getName() { return this.name; } @Override public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof EqualsAndHashCodeExample)) return false; EqualsAndHashCodeExample other = (EqualsAndHashCodeExample) o; if (!other.canEqual((Object)this)) return false; if (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false; if (Double.compare(this.score, other.score) != 0) return false; if (!Arrays.deepEquals(this.tags, other.tags)) return false; return true; } @Override public int hashCode() { final int PRIME = 59; int result = 1; final long temp1 = Double.doubleToLongBits(this.score); result = (result*PRIME) + (this.name == null ? 43 : this.name.hashCode()); result = (result*PRIME) + (int)(temp1 ^ (temp1 >>> 32)); result = (result*PRIME) + Arrays.deepHashCode(this.tags); return result; } protected boolean canEqual(Object other) { return other instanceof EqualsAndHashCodeExample; } public static class Square extends Shape { private final int width, height; public Square(int width, int height) { this.width = width; this.height = height; } @Override public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof Square)) return false; Square other = (Square) o; if (!other.canEqual((Object)this)) return false; if (!super.equals(o)) return false; if (this.width != other.width) return false; if (this.height != other.height) return false; return true; } @Override public int hashCode() { final int PRIME = 59; int result = 1; result = (result*PRIME) + super.hashCode(); result = (result*PRIME) + this.width; result = (result*PRIME) + this.height; return result; } protected boolean canEqual(Object other) { return other instanceof Square; } } } * ###### @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor\#\#\#\#\#\# ###### @NoArgsConstructor生成一个无参构造方法。当类中有final字段没有被初始化时,编译器会报错,此时可用@NoArgsConstructor(force = true),然后就会为没有初始化的final字段设置默认值 0 / false / null。对于具有约束的字段(例如@NonNull字段),不会生成检查或分配,因此请注意,正确初始化这些字段之前,这些约束无效。 import lombok.NoArgsConstructor; import lombok.NonNull; @NoArgsConstructor(force = true) public class User { @NonNull private Integer id; @NonNull private String name; private final String phone ; } @RequiredArgsConstructor会生成构造方法(可能带参数也可能不带参数),如果带参数,这参数只能是以final修饰的未经初始化的字段,或者是以@NonNull注解的未经初始化的字段 @RequiredArgsConstructor(staticName = "of")会生成一个of()的静态方法,并把构造方法设置为私有的 ![Image 1][] . ![Image 1][] import lombok.NonNull; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class User { @NonNull private Integer id ; @NonNull private String name = "bbbb"; private final String phone; } //另外一个 import lombok.NonNull; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor(staticName = "of") public class User { @NonNull private Integer id ; @NonNull private String name = "bbbb"; private final String phone; } @AllArgsConstructor 生成一个全参数的构造方法 ![Image 1][] Paste\_Image.png import lombok.AllArgsConstructor; import lombok.NonNull; @AllArgsConstructor public class User { @NonNull private Integer id ; @NonNull private String name = "bbbb"; private final String phone; } * ###### @Data\#\#\#\#\#\# ###### @Data 包含了@ToString,@EqualsAndHashCode,@Getter / @Setter和@RequiredArgsConstructor的功能 * ###### @Accessors\#\#\#\#\#\# ###### @Accessors 主要用于控制生成的getter和setter **主要参数介绍** * fluent boolean值,默认为false。此字段主要为控制生成的getter和setter方法前面是否带get/set * chain boolean值,默认false。如果设置为true,setter返回的是此对象,方便链式调用方法 * prefix 设置前缀 例如:@Accessors(prefix = "abc") private String abcAge 当生成get/set方法时,会把此前缀去掉 ![Image 1][] Paste\_Image.png * ###### @Synchronized\#\#\#\#\# ###### 给方法加上同步锁 import lombok.Synchronized; public class SynchronizedExample { private final Object readLock = new Object(); @Synchronized public static void hello() { System.out.println("world"); } @Synchronized public int answerToLife() { return 42; } @Synchronized("readLock") public void foo() { System.out.println("bar"); } } //等效代码 public class SynchronizedExample { private static final Object $LOCK = new Object[0]; private final Object $lock = new Object[0]; private final Object readLock = new Object(); public static void hello() { synchronized($LOCK) { System.out.println("world"); } } public int answerToLife() { synchronized($lock) { return 42; } } public void foo() { synchronized(readLock) { System.out.println("bar"); } } } * ###### @Wither\#\#\#\#\# ###### 提供了给final字段赋值的一种方法 //使用lombok注解的 import lombok.AccessLevel; import lombok.NonNull; import lombok.experimental.Wither; public class WitherExample { @Wither private final int age; @Wither(AccessLevel.PROTECTED) @NonNull private final String name; public WitherExample(String name, int age) { if (name == null) throw new NullPointerException(); this.name = name; this.age = age; } } //等效代码 import lombok.NonNull; public class WitherExample { private final int age; private @NonNull final String name; public WitherExample(String name, int age) { if (name == null) throw new NullPointerException(); this.name = name; this.age = age; } public WitherExample withAge(int age) { return this.age == age ? this : new WitherExample(age, name); } protected WitherExample withName(@NonNull String name) { if (name == null) throw new java.lang.NullPointerException("name"); return this.name == name ? this : new WitherExample(age, name); } } * ###### @onX\#\#\#\#\#\# ###### 在注解里面添加注解的方式 直接看代码 public class SchoolDownloadLimit implements Serializable { private static final long serialVersionUID = -196412797757026250L; @Getter(onMethod = @_({@Id,@Column(name="id",nullable=false),@GeneratedValue(strategy= GenerationType.AUTO)})) @Setter private Integer id; @Getter(onMethod = @_(@Column(name="school_id"))) @Setter private Integer schoolId; @Getter(onMethod = @_(@Column(name = "per_download_times"))) @Setter private Integer perDownloadTimes; @Getter(onMethod = @_(@Column(name = "limit_time"))) @Setter private Integer limitTime; @Getter(onMethod = @_(@Column(name = "download_to_limit_an_hour"))) @Setter private Integer downloadToLimitInHour; @Getter(onMethod = @_(@Column(name = "available"))) @Setter private Integer available = 1; } * ###### @Builder\#\#\#\#\#\# ###### @Builder注释为你的类生成复杂的构建器API。 lets you automatically produce the code required to have your class be instantiable with code such as: Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build(); 直接看官方示例,对比一下就都明白了 //使用lombok注解的 import lombok.Builder; import lombok.Singular; import java.util.Set; @Builder public class BuilderExample { private String name; private int age; @Singular private Set<String> occupations; } //等效代码 import java.util.Set; class BuilderExample { private String name; private int age; private Set<String> occupations; BuilderExample(String name, int age, Set<String> occupations) { this.name = name; this.age = age; this.occupations = occupations; } public static BuilderExampleBuilder builder() { return new BuilderExampleBuilder(); } public static class BuilderExampleBuilder { private String name; private int age; private java.util.ArrayList<String> occupations; BuilderExampleBuilder() { } public BuilderExampleBuilder name(String name) { this.name = name; return this; } public BuilderExampleBuilder age(int age) { this.age = age; return this; } public BuilderExampleBuilder occupation(String occupation) { if (this.occupations == null) { this.occupations = new java.util.ArrayList<String>(); } this.occupations.add(occupation); return this; } public BuilderExampleBuilder occupations(Collection<? extends String> occupations) { if (this.occupations == null) { this.occupations = new java.util.ArrayList<String>(); } this.occupations.addAll(occupations); return this; } public BuilderExampleBuilder clearOccupations() { if (this.occupations != null) { this.occupations.clear(); } return this; } public BuilderExample build() { // complicated switch statement to produce a compact properly sized immutable set omitted. // go to https://projectlombok.org/features/Singular-snippet.html to see it. Set<String> occupations = ...; return new BuilderExample(name, age, occupations); } @java.lang.Override public String toString() { return "BuilderExample.BuilderExampleBuilder(name = " + this.name + ", age = " + this.age + ", occupations = " + this.occupations + ")"; } } } * ###### @Delegate\#\#\#\#\#\# ###### 这个注解也是相当的牛逼,看下面的截图,它会该类生成一些列的方法,这些方法都来自与List接口 ![Image 1][] Paste\_Image.png -------------------- ###### 附带一个我使用的例子\#\#\#\#\#\# ###### import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.ToString; import lombok.experimental.Accessors; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import java.io.Serializable; import java.util.Date; @Entity @Table(name= Constants.TABLE_SCHOOL_DOWNLOAD_LIMIT) @RequiredArgsConstructor(staticName = "of") @Accessors(chain = true) @ToString public class SchoolDownloadLimit implements Serializable { private static final long serialVersionUID = -196412797757026250L; @Getter(onMethod = @_({@Id,@Column(name="id",nullable=false),@GeneratedValue(strategy= GenerationType.AUTO)})) @Setter private Integer id; @Getter(onMethod = @_(@Column(name="school_id"))) @Setter private Integer schoolId; @Getter(onMethod = @_(@Column(name = "per_download_times"))) @Setter private Integer perDownloadTimes; @Getter(onMethod = @_(@Column(name = "limit_time"))) @Setter private Integer limitTime; @Getter(onMethod = @_(@Column(name = "download_to_limit_an_hour"))) @Setter private Integer downloadToLimitInHour; @Getter(onMethod = @_(@Column(name = "available"))) @Setter private Integer available = 1; @Getter(onMethod = @_(@Column(name = "create_time"))) @Setter private Date createTime; @Getter(onMethod = @_(@Column(name = "update_time"))) @Setter private Date updateTime; } [就介绍这么多了,更多的注解请看官方文档][Link 1] 作者:缓慢移动的蜗牛 链接:https://www.jianshu.com/p/365ea41b3573 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 [https_projectlombok.org]: https://link.jianshu.com?t=https://projectlombok.org/ [https_github.com_rzwitserloot_lombok]: https://link.jianshu.com?t=https://github.com/rzwitserloot/lombok [Image 1]: [Link 1]: https://link.jianshu.com?t=https://projectlombok.org/features/index.html
相关 lombok 为什么需要lombok Java项目中,充斥着太多不友好的代码:POJO的getter/setter/toString;这些样板代码既没有技术含量,写起来又比较麻烦,又影响 绝地灬酷狼/ 2022年12月11日 02:28/ 0 赞/ 115 阅读
相关 lombok 转自:http://blog.csdn.net/mlinge/article/details/51340362 lombok是什么 lombok 是通过提供简单注 傷城~/ 2022年07月12日 06:56/ 0 赞/ 187 阅读
相关 lombok 转自:http://blog.csdn.net/mlinge/article/details/51340362 lombok是什么 lombok 是通过提供简单注 - 日理万妓/ 2022年07月12日 06:56/ 0 赞/ 187 阅读
相关 Lombok 【问题描述】 长假回来上班后的第一天,开发环境竟然出问题了。代码中所有的getter和setter方法都报错,显示各个实体类中没有提供对应的get/set方法。 ゝ一世哀愁。/ 2022年06月07日 03:44/ 0 赞/ 195 阅读
相关 Lombok https://www.jianshu.com/p/365ea41b3573 Lombok简介\\\ Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些 骑猪看日落/ 2022年06月02日 00:45/ 0 赞/ 244 阅读
相关 Lombok Lombok简介 > Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对 桃扇骨/ 2022年05月22日 00:23/ 0 赞/ 192 阅读
相关 Lombok 官网下载地址[https://projectlombok.org][https_projectlombok.org] lombok是一个可以帮助我们简化java代码编写的工具 以你之姓@/ 2022年05月18日 23:13/ 0 赞/ 219 阅读
相关 lombok lombok简介 lombok是暑假来到公司实习的时候发现的一个非常好用的小工具,刚见到的时候就感觉非常惊艳,有一种相见恨晚的感觉,用了一段时间之后感觉的确挺不错,所以特 阳光穿透心脏的1/2处/ 2022年05月17日 04:46/ 0 赞/ 189 阅读
相关 Lombok 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MOTUI/article/details/79012846 Lombok 港控/mmm°/ 2022年05月14日 16:45/ 0 赞/ 191 阅读
相关 Lombok 概述 Lombok 提供了一些注解来帮助我们简化消除一些必须有但显得臃肿的 java 代码,如 getting 和 setting,它是通过编译时字节码修改完成,性 素颜马尾好姑娘i/ 2021年09月10日 06:08/ 0 赞/ 366 阅读
还没有评论,来说两句吧...