亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Lombok 項目是否與使用 getter 和 setter 的數據封裝相矛盾?

Lombok 項目是否與使用 getter 和 setter 的數據封裝相矛盾?

素胚勾勒不出你 2023-11-10 16:43:39
聲明私有變量并通過公共 getter/setter 方法(Java 中的封裝原理)訪問它,可以在 setter 方法中添加自定義驗證。例如:如果我setBalance()在 Class 的 setter 方法中放置負數驗證Bank,我可以限制Bank. 這意味著可以限制字段中的意外更改。所以如果我使用 lombok,顯然我不需要定義 getter/setter 方法。我可以做什么來合并上述驗證。這不會限制Java的數據封裝特性的利用嗎?
查看完整描述

3 回答

?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

通過使用@Getter,?@Setter,@Data@Value?Lombok會自動生成您字段的公共訪問器,如果您不需要公開AccessLevel.NONE可以在@Getter,上使用的字段@Setter。使用 lombok 可以尊重
封裝。

我建議您將數據結構和可以對其執行的操作(例如驗證)視為單獨的關注點。通過這種方式,您將能夠分別修改數據和驗證。為了實現這一點,您可以使用一些框架,如spring或aspectj。

如果您覺得這種方法對您的應用程序來說太過分了,您可以求助于不可變數據結構 (?@Value) 以及用于創建實例的私有構造函數和靜態方法。這些方法將執行必要的驗證。

在類上添加驗證的另一種方法是使用hibernate 驗證在 getter 上使用注釋。


查看完整回答
反對 回復 2023-11-10
?
holdtom

TA貢獻1805條經驗 獲得超10個贊

是的。你是對的。所以你應該根據上下文謹慎使用它。

如果一個對象是一個富域對象,那么簡單地@Setter為其所有字段添加公共設置器可能是一個壞主意,因為客戶端可以輕松地將任何字段設置為任何值,而無需調用封裝所有應完成的業務邏輯的正確方法。 。所以最終,對象的狀態可能是不正確的。

但如果對象只是作為一個數據容器,沒有任何業務邏輯(例如DTO),使用@Setter/@Getter可以節省你一些時間,并使代碼噪音更少。


查看完整回答
反對 回復 2023-11-10
?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

它不會破壞數據封裝,而是使其更加方便:簡單的 getter 和 setter 只是噪音。

如果您的代碼需要除簡單的獲取或設置之外的其他內容,那么顯然自動生成它們是沒有意義的——但這是一個正交問題:您也無法手動完成。

您將受限訪問與業務邏輯混為一談。

無論如何:您也許能夠使用 AOP 系統在自動生成的函數周圍放置保護子句,但您需要強制執行處理器運行的順序。在我看來,這會造成混亂并產生額外的認知開銷:業務邏輯要么是顯式的,要么是分層在顯式代碼之上的。


查看完整回答
反對 回復 2023-11-10
  • 3 回答
  • 0 關注
  • 231 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號