終極CRUD-2-用lombok提高開發效率
目錄
- 1 lom介紹與基本使用
- 2 lombok 註意點
- 2.1 lombok自動生成方法可以混合自己寫的方法
- 2.2 盡量不要使用@Data
- 2.3 屬性不要使用基本類型
- 3 lombok 缺陷
- 4 lombok 底層原理
1 lom介紹與基本使用
https://zhuanlan.zhihu.com/p/32779910
lombok概念和基本使用,看這一篇就足夠了
2 lombok 註意點
2.1 lombok自動生成方法可以混合自己寫的方法
? 見以下代碼
@Getter @Setter public class FishermanDemo { private String username; private Integer time; public String getUsername(){ System.out.println("hello world"); return "hello username"; } public void setTime(Integer time){ System.out.println("hello time"); this.time = time; } }
編譯後的class文件
public class FishermanDemo { private String username; private Integer time; public FishermanDemo() { } public String getUsername() { System.out.println("hello world"); return "hello username"; } public void setTime(Integer time) { System.out.println("hello time"); this.time = time; } public Integer getTime() { return this.time; } public void setUsername(String username) { this.username = username; } }
我們可以看出,lombok編譯後的代碼不會覆蓋我們自己寫的getter/setter方法。一般情況下,我們不會自己寫getter/setter方法,但是也有些特殊的地方。比如POJO對象如果有時間類型,並且保存的類型和數據庫字段不一致,那麽這個時候就需要自己定義該時間類型的getter/setter方法,因為像Mybatis這樣的框架是通過getter/setter方法來獲取和註入值的。
2.2 盡量不要使用@Data
我們看源文件
@Data
public class FishermanDemo {
private String username;
private Integer time;
}
反編譯後的文件
public class FishermanDemo {
private String username;
private Integer time;
public FishermanDemo() {
}
public String getUsername() {
return this.username;
}
public Integer getTime() {
return this.time;
}
public void setUsername(String username) {
this.username = username;
}
public void setTime(Integer time) {
this.time = time;
}
public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof FishermanDemo)) {
return false;
} else {
FishermanDemo other = (FishermanDemo)o;
if (!other.canEqual(this)) {
return false;
} else {
Object this$username = this.getUsername();
Object other$username = other.getUsername();
if (this$username == null) {
if (other$username != null) {
return false;
}
} else if (!this$username.equals(other$username)) {
return false;
}
Object this$time = this.getTime();
Object other$time = other.getTime();
if (this$time == null) {
if (other$time != null) {
return false;
}
} else if (!this$time.equals(other$time)) {
return false;
}
return true;
}
}
}
protected boolean canEqual(Object other) {
return other instanceof FishermanDemo;
}
public int hashCode() {
int PRIME = true;
int result = 1;
Object $username = this.getUsername();
int result = result * 59 + ($username == null ? 43 : $username.hashCode());
Object $time = this.getTime();
result = result * 59 + ($time == null ? 43 : $time.hashCode());
return result;
}
public String toString() {
return "FishermanDemo(username=" + this.getUsername() + ", time=" + this.getTime() + ")";
}
}
我們可以看到 反編譯後的文件有 getter/setter、無參構造器、equal、hascode、toString。我們經常使用的POJO對象一般只有getter/setter、無參構造器、有參數構造器、toString。因此我們可以用以下5個註解。
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString
2.3 屬性不要使用基本類型
這個屬於POJO對象基本約束規範,不要使用基本數據類型。
lombok對基本數據類型boolean反編譯後的結果和Boolean類型有一些不一致。
假設private boolean sex, boolean基本類型sex的getter/setter方法如下,isSex和setSex,而Boolean就是正常的getSex和setSex
3 lombok 缺陷
使用lombok有一個最大的缺陷,就是在團隊中所有開發人員都需要安裝相關的lombok插件
4 lombok 底層原理
lombok很神奇,很我們以往使用jar包完全不一樣,它必須要求開發工具安裝相應的jar包,原因就是跟lombok底層實現原理有很大的關系。
lombok利用JSR269 api(Pluggable Annotation Processing API )創建編譯期的註解處理器,註意所有的@Getter、@Setter、@Data、@ToString方法都是編譯期註解 @Retention(RetentionPolicy.SOURCE)
這跟springboot等在運行期間利用反射獲取註解相關的值完全不一樣。而lombok能夠在編譯期就完成這些不可思議的工作,完全是因為JSR269的規範,允許在編譯時指定一個processor類來對編譯階段的註解進行幹預。
簡單一句話,通過JSR269規範,允許你對一個類,在編譯期間進行相應的更改,比如增加一些方法。
因此相關的開發工具例如IDEA、Eclipse完全不知道這些方法的存在
@Getter
public class FishermanDemo {
private String username;
}
反編譯後的class文件
public class FishermanDemo {
private String username;
public FishermanDemo() {
}
public String getUsername() {
return this.username;
}
}
如果這個時候直接調用getUsername()
FishermanDemo fishermanDemo = new FishermanDemo();
fishermanDemo.getUsername();
開發工具的編譯期會報錯,因為他們完全不知道getUsername()方法的存在,因此必須安裝相關的lombok插件,才能使開發工具不報錯。
參考資料
https://blog.mythsman.com/2017/12/19/1/#more
https://zhuanlan.zhihu.com/p/32779910
請尊重作者勞動成果,轉載請註明出處。以上內容若有侵權,請聯系作者,立即刪除終極CRUD-2-用lombok提高開發效率