2017-04-25 33 views

回答

4

這是一個很好的問題。通常你會看到代碼示例,它們使得成員是私人的,但是通過getter/setter對暴露它們,而getter/setter除了設置相應的成員外沒有其他任何操作。

在我的書中,根本不是封裝。你不僅僅只是讓成員公開。雖然很多人不願意這樣做,但他們會很樂意爲所有成員自動提供訪問器。

提供訪問器的一個原因是能夠進行輸入驗證。例如。如果empId有一個checksum,你可以在setter中強制執行它。直接訪問該成員是不可能的。

在我看來,最好考慮一下這個對象將扮演的角色,看看如何用最少的訪問器來實現這個角色。否則你的代碼可能會違反Law of Demeter

1

你是絕對正確的,創建setter/getter或者使這些字段公開都以同樣的方式違反了封裝,因此如果你想封裝你的私有字段,可能是因爲你在一個面向對象的環境中工作,你不想使用這些東西。

爲了您的問題爲什麼需要創建setter/getters:大多數項目(有意或無意)不會將其設計基於Object-Orientation。還有其他的範例,數據和功能是分開的,因此如果封裝起作用的話,封裝起了很小的作用。

在Java世界中,通常在這些Beans(基本上可以訪問所有字段)上使用純的(或非常接近純的)數據結構(Beans)和Services/Components/EJB /等。通常這些體系結構將功能部分進一步分解爲演示文稿,業務,持久性(3層體系結構)等主題,或者創建可訪問所有相關字段(例如MVC通常如何完成)的顯式控制過程。

一種方法是否優於另一種方法可能是一種主觀的討論,但簡短的回答是:這通常是不同的範例(不是面向對象),這就是創建setter/getters的原因。

相關問題