Lombok!代碼簡潔神器還是代碼“亞健康”元兇?

源 / 文/
如果您正在閱讀此文,想必您對(duì)Project Lombok已經(jīng)有了一段時(shí)間的了解。您是否正準(zhǔn)備擁抱Lombok?還是正準(zhǔn)備將如此酷炫的項(xiàng)目推薦給你的團(tuán)隊(duì)?如果您準(zhǔn)備那么做,不妨聽聽我在使用Lombok一年后的一些感受。
我承認(rèn),Lombok是一個(gè)很不錯(cuò)的Java庫,它可以讓你在少寫代碼的同時(shí)耍耍酷,簡單的幾個(gè)注解,就可以干掉一大片模板代碼。但是,所有的源代碼很多時(shí)候是用來閱讀的,只有很少的時(shí)間是用來執(zhí)行的(你可以細(xì)品這句話)。

愛的開始,恨的起源

public class MyObject{
private Long id;
private String name;
private int age;
private int gender;
public Long getId(){
return id;
}
public void setId(Long id){
this.id = id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
public int getGender(){
return gender;
}
public void setGender(int gender){
this.gender = gender;
}
@Override
public boolean equals(Object o){
if(this == o){
return true;
}
if(o == null || getClass() != o.getClass()){
return false;
}
MyObject obj = (MyObject) o;
return age = obj.age &&
gender = obj.gender &&
Objects.equals(id,obj.id) &&
Objects.queals(name,obj.name);
}
@Override
public int hashCode(){
return Objects.hash(id,name,age,gender);
}
@Override
public String toString(){
return "MyObject{"+
"id="+id+
"name="+name+
"age="+age+
"gender="+gander+
"}";
}
}

@Getter和@Setter注解后,代碼會(huì)像下面這樣看起來很苗條:@Getter
@Setter
public class MyObject{
private Long id;
private String name;
private int age;
private int gender;
@Override
public boolean equals(Object o){
if(this == o){
return true;
}
if(o == null || getClass() != o.getClass()){
return false;
}
MyObject obj = (MyObject) o;
return age = obj.age &&
gender = obj.gender &&
Objects.equals(id,obj.id) &&
Objects.queals(name,obj.name);
}
@Override
public int hashCode(){
return Objects.hash(id,name,age,gender);
}
@Override
public String toString(){
return "MyObject{"+
"id="+id+
"name="+name+
"age="+age+
"gender="+gander+
"}";
}
}
@EqualsAndHashCod注解替換到equals和hashCode方法:@Getter
@Setter
@EqualsAndHashCode
public class MyObject{
private Long id;
private String name;
private int age;
private int gender;
@Override
public String toString(){
return "MyObject{"+
"id="+id+
"name="+name+
"age="+age+
"gender="+gander+
"}";
}
}
@ToString注解去掉對(duì)于的方法:@Getter
@Setter
@EqualsAndHashCode
@ToString
public class MyObject{
private Long id;
private String name;
private int age;
private int gender;
}
@Data,可以替換掉類名頭上那坨像翔一樣的東西:@Data
public class MyObject{
private Long id;
private String name;
private int age;
private int gender;
}
@Slf4j,@NoArgsConstructor,@AllArgsConstructor等等,介紹Lombok用法不是本文重點(diǎn)。
扭曲的審美,愛的隱患

1. JDK版本問題
2. 脅迫使用
3. 可讀性差
@AllArgsConstructor注解,它將提供一個(gè)巨型構(gòu)造器,讓外界有機(jī)會(huì)在初始化對(duì)象時(shí)修改類中所有的屬性。首先,這是極其不安全的,因?yàn)轭愔心诚祵傩晕覀兪遣幌M恍薷牡模涣硗猓绻硞€(gè)類中有幾十個(gè)屬性存在,就會(huì)有一個(gè)包含幾十個(gè)參數(shù)的構(gòu)造器被Lombok注入到類中,這是不理智的行為;其次,構(gòu)造器參數(shù)的順序完全由Lombok所控制,我們并不能操控,只有當(dāng)你需要調(diào)試時(shí)才發(fā)現(xiàn)有一個(gè)奇怪的“小強(qiáng)”在等著你;最后,在運(yùn)行代碼之前,所有JavaBean中的方法你只能想象他們長什么樣子,你并不能看見。4. 代碼耦合度增加
5. 得不償失

總結(jié)
健康滿分

這才是牛逼程序員的標(biāo)配!

字節(jié)跳動(dòng)小組長無意中得知整個(gè)部門的薪資!自己只有28K!手下人卻拿35K!怎么辦?

發(fā)現(xiàn):字節(jié)跳動(dòng)的內(nèi)卷從男休息室開始的
END


頂級(jí)程序員:topcoding
做最好的程序員社區(qū):Java后端開發(fā)、Python、大數(shù)據(jù)、AI
一鍵三連「分享」、「點(diǎn)贊」和「在看」
評(píng)論
圖片
表情
