為什麼人們寧可用Lombok,也不把成員設為public?
大家好,我是哪吒。
思考一個問題,為何屬性是private,然後用get/set方法?
普遍想法
- 大家都這麼寫,我也這麼寫;
- 這是Java的封裝特性,你不知道?
- 隱藏屬性,不暴露過多細節,更安全;
下面系統的分析一下,why?
1、採用get/set方法其實是Java的一個協議,在1996年12月提出的java bean1.00-A
,通過統一的規範可以設定物件的值(比如get、set方法)。很多框架也是在此基礎上開發的,底層原始碼也都是通過get/set訪問屬性的。
2、很多時候,可以通過get/set方法,① 增加一些功能;② 增加一些特定的修改,比如打折;③ 增加一些訪問邏輯;④ 還可以通過set方法觸發一些事件。
3、如果你將一個屬性定義為public了,而且在50處呼叫了,此時,產品經理來了一個需求,將此次的促銷商品打五折;難道你要去修改這50處的程式碼嗎?如果你用get/set封裝了,修改對應屬性的set方法即可,so easy~!
4、就像上面所說,大家都這麼寫,我也這麼寫
,但是,對於大多數企業應用來說,直接將屬性寫成public,也是沒毛病。
5、也可以理解為,“風格統一的程式碼更好維護”。
6、假如我新接手一個專案,要用到某個bean,我也不知道都有什麼屬性,一般的做法都是先new一個,然後通過小數點聯想出來,如果沒有get/set,那真的很煩躁。
7、現在都是面向介面程式設計,而Java介面中是不能定義普通的屬性的,但可以定義get/set方法。
來,一起回味一下封裝的概念。
封裝是指一個物件對其他物件隱藏其部分狀態和行為,而僅向程式其他部分暴露有限的介面的能力。封裝也叫作資訊隱藏或者資料訪問保護。類通過暴露有限的訪問介面,授權外部僅能通過類提供的方式(或者叫函式)來訪問內部資訊或者資料。對於封裝這個特性,我們需要程式語言本身提供一定的語法機制來支援。這個語法機制就是訪問許可權控制。
Lombok應運而生
為了解決get/set的程式碼臃腫問題,Lombok應運而生。簡單無腦,解決一切煩惱。
使用 Lombok 可以讓程式碼更加簡潔,減少冗餘的程式碼量。使用 Lombok 時,可以使用註解來生成常用的程式碼,如 getter、setter、equals、hashCode 和 toString 方法,這些方法通常都是在 Java 類中需要手動編寫的。 使用 Lombok 可以省去這些手動編寫的步驟,使程式碼更加簡潔。此外,使用 Lombok 還有一個好處是可以使用註解來生成建構函式和靜態建構函式,這些建構函式可以接受所有屬性作為引數。這樣就可以避免手動編寫很多建構函式的情況。因此,使用 Lombok 可以讓程式碼更加簡潔,減少冗餘的程式碼量,提高程式碼的可讀性和可維護性。
Lombok代替public,因為public成員的可見性太大。將成員定義為public意味著任何地方都可以訪問這個成員,這可能會導致成員被意外地修改,從而影響類的穩定性和正確性。而使用Lombok可以通過自動生成getter和setter方法來保護成員的可見性,從而提高類的封裝性和可維護性。此外,使用Lombok還可以幫助開發人員減少編寫重複的程式碼,提升工作效率。
因此,為了保護成員的可見性並提升程式碼的可維護性,許多人寧可使用Lombok,也不願意將類的成員設為public。
不和諧的聲音,禁止使用Lombok?
1、jdk版本問題
目前國內大多數Java專案,採用的都是JDK1.8,因為它夠穩定,功能也完全夠用,但是,如果哪一天,你的客戶心血來潮,就是想用JDK11,甚至JDK17,此時,你會發現Lombok不好用了,於是,不得不將好幾百個實體類,通過idea生成get/set、equals、toString等方法,很煩躁。
2、被迫營業
當你的客戶獲取到你的原始碼之後,他也想看看,執行一下,此時發現沒安裝Lombok,報錯了,安裝Lombok,不瞭解這是什麼,還要去百度學習一下,被迫營業,很煩躁。
3、可讀性差
- Lombok隱藏了JavaBean的封裝細節;
- toString()不知道會列印什麼;
- @AllArgsConstructor提供一個全量構造器, 讓外界在初始化時,可以隨意修改其屬性,極其不安全。如果屬性過多,這個全量構造器,看起來,很雞肋;
- 引數的順序我們也無法控制,都是按照Lombok的心情來的;
4、使用Lombok,寫程式碼的時候很爽,但它
- 汙染了你的程式碼;
- 玷汙了Java語言的純粹;
- 破壞了Java程式碼的完整性、可讀性、安全性;
- 增加了程式碼的耦合度;
- 增加了程式碼的除錯難度;
這是一種弊大於利、得不償失的操作。
總結
綜上所述,將成員變數定義為public是不可取的,使用Lombok也不是一個明智的選擇,還是老老實實的通過IDE生成get/set方法吧。