前言
前幾天有個新來的同事(實習生)驚訝的對我說:我們的代碼裡好多錯誤,我的程序本地都啟動不了。
我一臉懵逼的質問他:目前線上的代碼,怎麼會有問題嗎?
他不服氣的說:你來看嘛,就是有問題,Dao實體get()和set()方法都沒有。
此處省略10000字,讓我流一會兒技術人的眼淚。
Lombok
通常我們代碼裡的實體Dao或者自定義Bean都會有get()和set()方法,set是設置的意思,而get是獲取的意思,顧名思義,這兩個方法是對數據進行設置和獲取用的。一般來說set和get方法都是對私有域變量進行操作的,所以大多數都是使用在包含特定屬性的類實體中。
現實中有說許多看到密密麻麻的get()和set()就會頭疼,但現在有了Lombok,它提供了簡單的註解的形式來幫助我們簡化消除一些必須有但顯得很臃腫的 java 代碼。通過使用對應的註解,可以在編譯源碼的時候生成對應的方法,所以不會影響任何運行效率。
但也許有的人由於習慣問題,看不到get()和set()也會缺乏一些安全感。
傳統set和get方法
既然是實體,裡面少不了要定義變量,而實體變量的值的設置和獲取,由set()和get()方法實現。標準set和get方法定義如下:
public class MedalinfoVo {private Long id;private String medalname;private String icon;private Integer isLight;private Integer medallevel;public Long getId() {return id; } public void setId(Long id) { this.id = id; } public String getMedalname() { return medalname; } public void setMedalname(String medalname) { this.medalname = medalname; } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; } public Integer getIsLight() { return isLight; } public void setIsLight(Integer isLight) { this.isLight = isLight; } public Integer getMedallevel() { return medallevel; } public void setMedallevel(Integer medallevel) { this.medallevel = medallevel; }}
方法setXxx()參數為該變量的值,即我們在給該變量定義值的時候設置的。
方法getXxx()無參,直接返回該變量的在主內存的值。
可以看到滿篇的set和get方法,如果一個實體有20個變量或以上,那麼整個class看起來就會非常長而且臃腫,既沒有技術含量,又影響著代碼的美觀,要增加或修改的時候變得麻煩和易錯。
重要的是set和get方法,也存在線程同步問題。
Lombok的set和get方法
Lombok是一種自動接通你的編輯器和構建工具的一個Java庫。lombok其實就是幫助我們編寫getter或者equals方法的一個「工具」。官方網站:Lombok官網
lombok的使用
首先引入maven依賴:
使用了lombok的實體
@Getter@Setterpublic class MedalinfoVo {private Long id;private String medalname;private String icon;private Integer isLight;private Integer medallevel;}
看到沒有,使用了lombok的實體,變得非常簡潔和美觀,而且執行起來效率變得非常快,這是因為lombok庫直接調用了java源碼類庫而實現,具體可以詳看lombok源碼實現。
lombok實現原理
Lombok的基本流程應該基本是這樣:
定義編譯期的註解利用JSR269 api(Pluggable Annotation Processing API )創建編譯期的註解處理器利用tools.jar的javac api處理AST(抽象語法樹)將功能註冊進jar包
只是通過簡單的@Getter @Setter 註解便可以實現變量的set和get方法,除此外還有@ToString、@NoArgsConstructor (構造函數)等,諸多註解供你使用,為你節省大量寶貴時間和代碼提高開發效率。