一、簡介

我們想把今天的課用在封裝上。您已經大致了解它是什麼。

封裝

封裝有什麼好處?它們有很多,但我可以挑出四個,在我看來,它們是主要的:


2.有效的內部狀態

在程序中,當一個對象與其他幾個類交互時,經常會出現這種情況。這些與對象的交互會破壞對象內部的數據,使對象無法繼續按預期工作。

因此,對象需要跟踪對其內部數據的任何更改,或者更好的是,自己進行更改。

如果我們不希望某些變量被其他類更改,那麼我們將其聲明為私有的。一旦我們這樣做了,只有它自己的類的方法才能訪問它。如果我們希望變量是只讀的,那麼我們需要public getter為相關變量添加一個。

例如,假設我們希望每個人都能夠知道我們集合中元素的數量,但我們不希望他們能夠在未經我們許可的情況下更改集合。然後我們聲明一個private int count變量和一個public getCount()方法。

正確使用封裝可確保沒有類可以直接訪問我們類的內部數據,從而防止任何超出我們控制範圍的更改。這些更改只能通過調用與正在更改的變量相同的類的方法來實現。

最好假設其他程序員將始終以對他們最方便的方式使用您的類,而不是對您(對您的類)最安全的方式。這種行為是這兩個錯誤的來源,也是防止它們的嘗試。


3. 驗證方法參數

有時我們需要驗證傳遞給我們方法的參數。例如,假設我們有一個類代表一個人並讓您設置生日。我們必須檢查所有輸入數據,以確保它符合程序邏輯和我們類的邏輯。例如,不允許生日在第 13 個月或 2 月 30 日,等等。

為什麼有人會在出生日期上註明 2 月 30 日?首先,這可能是輸入數據時的用戶錯誤。其次,程序在開始像發條一樣運行之前可能有很多錯誤。例如,可能出現以下情況。

一個程序員編寫了一個程序來識別生日是後天的人。例如,假設今天是 3 月 3 日。程序將數字 2 添加到該月的當前日期,並查找所有 3 月 5 日出生的人。似乎一切都是正確的。

但是當 3 月 30 日到來時,程序將找不到任何人,因為日曆沒有 3 月 32 日。如果我們檢查傳遞給方法的數據,程序的錯誤就會少得多。

還記得我們研究ArrayList和分析它的代碼嗎?我們看到andget方法set檢查是否index大於或等於零且小於數組的長度。 更重要的是,如果索引落在數組的邊界之外,這些方法會拋出異常。 這是輸入驗證的經典示例。


4. 更改代碼時盡量減少錯誤

假設我們在參與一個大型項目時寫了一個超級有用的類。每個人都非常喜歡它,以至於其他程序員開始在他們的代碼中的數百個地方使用它。

該課程非常有用,您決定對其進行一些改進。但是如果你從類中刪除任何方法,那麼幾十個人的代碼將停止編譯。他們將不得不重寫一切。你做的改變越多,你就會犯越多的錯誤。你會破壞很多集會,你會被討厭。

但是當我們更改聲明為私有的方法時,我們知道在任何地方都沒有任何其他類可以調用這些方法。我們可以重寫它們,改變參數的數量和類型,任何依賴的外部代碼都將繼續工作。好吧,至少它會編譯。


5.我們決定我們的對像如何與外部對象交互

我們可以限制一些可以用我們的對象執行的操作。例如,假設我們希望一個對像只被實例化一次。即使它可能在項目中的多個地方創建。由於封裝,我們可以做到這一點。

封裝2

封裝讓我們可以添加額外的限制,這可以轉化為額外的優勢。例如,該類String被實現為不可變對象。類的對像String從創建的那一刻到死亡的那一刻是不可變的。該類的所有方法String( remove, substring, ...) 都返回一個新字符串,而不對調用它們的對像做任何更改。

封裝是一件很有意思的事情。