事件回顧
小黑不是一個啰嗦的人,所以直接來看下代碼
@Data public class DataSourceConditionVo extends BaseConditionVo{ private Long id; private String sourceName; private Integer status; private Long driverId; public DataSourceConditionVo(Long id,Integer status){ this.id = id; this.status = status; } }
大家看出有什麽問題嗎?小黑悄悄的告訴大家,少寫了一個無參的構造函數,導致 controller 將客戶端傳過來的json轉成實體對象的時候報錯了。
大家可不要笑話犯這麽低級的錯誤,其實之前是有寫無參構造函數的,只是看到 @Data 這個注解,以爲會自動的生成無參構造函數,所以就把無參構造函數去掉了。汗。。
爲了防止繼續犯錯,所以把lombok(lombok是什麽?你還不知道?那你還不搬個板凳,買包瓜子,仔細往下面看)常用的注解都看了一遍,現在分享給大家,希望大家不要犯和小黑一樣的錯誤。
lombok
首先,先和大家普及一下lombok(了解過的可以快進)的相關知識。
1 什麽是lombok
官方的介紹我就不複制了(是因爲懶嗎),主要是以簡單的注解形式來簡化一些沒有技術含量並且又不得不寫的代碼,比如 get\set ,構造方法等等,提高了代碼的簡潔性。
2 lombok的使用
lombok的使用非常簡單,只需要引入 jar 包,然後 idea 安裝一個 lombok 插件。
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version></version> </dependency>
version選擇最新的就可以了。idea 安裝插件就不介紹了,相信在座的各位都是大佬。
2.1 @Data
@Data注解在類上,會爲類的所有屬性自動生成setter/getter、equals、canEqual、hashCodetoString方法。下面通過簡單的代碼看下效果:
@Data public class User { private String name; private Integer sex; }
現在看下編譯之後的 class 文件:
public class User { private String name; private Integer sex; public User() { } public String getName() { return this.name; } public Integer getSex() { return this.sex; } public void setName(final String name) { this.name = name; } public void setSex(final Integer sex) { this.sex = sex; } public boolean equals(final Object o) { if (o == this) { return true; } else if (!(o instanceof User)) { return false; } else { User other = (User)o; if (!other.canEqual(this)) { return false; } else { Object this$name = this.getName(); Object other$name = other.getName(); if (this$name == null) { if (other$name != null) { return false; } } else if (!this$name.equals(other$name)) { return false; } Object this$sex = this.getSex(); Object other$sex = other.getSex(); if (this$sex == null) { if (other$sex != null) { return false; } } else if (!this$sex.equals(other$sex)) { return false; } return true; } } } protected boolean canEqual(final Object other) { return other instanceof User; } public int hashCode() { int PRIME = true; int result = 1; Object $name = this.getName(); int result = result * 59 + ($name == null ? 43 : $name.hashCode()); Object $sex = this.getSex(); result = result * 59 + ($sex == null ? 43 : $sex.hashCode()); return result; } public String toString() { return “User(name=” + this.getName() + “, sex=” + this.getSex() + “)”; } }
2.2 @Getter/@Setter
這個就不演示了,注解在類或字段上面,就是生成 get 和 set 方法,具體看 @Data 裏面生産的 get/set 方法。
2.3 @ToString
這個也不演示了,注解在類上面,生成 toString 方法。
2.4 @EqualsAndHashCode
這個也不演示了,注解在類上面,生成 hashCode 和 equals 方法。
2.5 @NoArgsConstructor
注解在類,生成無參的構造方法。這個看下生成的代碼,上面的代碼就是加了這個注解就可以了。
public class User { private String name; private Integer sex;
public User() { } }
2.6 @RequiredArgsConstructor
注解在類上,生成包含final和@NonNull注解的成員變量的構造器。
public class User { private String name; private final Integer sex;
public User(final Integer sex) { this.sex = sex; } }
2.7 @AllArgsConstructor
注解在類,生成包含類中所有字段的構造方法。
public class User { private String name; private final Integer sex;
public User(final String name, final Integer sex) { this.name = name; this.sex = sex; } }
2.8 @Slf4j
這個也是用的比較多的,注解在類上,生成log常量
public class User { private static final Logger log = LoggerFactory.getLogger(User.class); private String name; private Integer sex;
public User() { } }
3 Lombok的優缺點
- 優點:a. 能通過注解的形式自動生成構造器、getter/setter、equals、hashcode、toString等方法,提高了一定的開發效率。b. 讓代碼變得簡潔,不用過多的去關注相應的方法。c. 屬性做修改時,也簡化了維護爲這些屬性所生成的getter/setter方法等。
- 缺點:a. 不支持多種參數構造器的重載。b. 雖然代碼變得簡潔,但也大大降低了代碼的可讀性和完整性。
4 總結
Lombok的這些知識點雖然簡單,但是用得好卻能大大的提高開發效率。不管別人用不用,反正早就開始用起來了。真香
一個小問題,卻讓了解了這麽多知識,果然有成爲碼王的潛質。一定會努力學習,完成自己 目標。
好了,今天的分享就到這裏了,我們下期再見。喜歡的夥伴記的點個贊哦!愛你,麽麽哒!