受保護的方法可以被不能從定義類繼承的類訪問的事實一直困擾着我。我在抽象類中經常使用抽象保護方法來讓子類定義一些功能。這些實際上是私有方法 - 它們不打算在類層次結構之外調用。但是,Java並沒有給我一種說法,因爲受保護的方法可以被包中的任何類調用。有沒有很好的理由從非子類訪問Java保護的方法?
我的問題是,允許這樣做的設計原理是什麼?是否有一個有效的用例需要一個只能在程序包或程序包外的隨機子類中調用的方法?我從來沒有遇到過這種情況,我想知道其他人是否有。
受保護的方法可以被不能從定義類繼承的類訪問的事實一直困擾着我。我在抽象類中經常使用抽象保護方法來讓子類定義一些功能。這些實際上是私有方法 - 它們不打算在類層次結構之外調用。但是,Java並沒有給我一種說法,因爲受保護的方法可以被包中的任何類調用。有沒有很好的理由從非子類訪問Java保護的方法?
我的問題是,允許這樣做的設計原理是什麼?是否有一個有效的用例需要一個只能在程序包或程序包外的隨機子類中調用的方法?我從來沒有遇到過這種情況,我想知道其他人是否有。
此問題的解決方案聽起來像重新組織您的項目以包含多個包,以便每個包都有超類,它們的子類以及其他任何包。這是一個解決方法,而不是一個堅強而快速的解決方案,但它應該做你想做的事情。
在測試類的大型項目上調用被測試類的內部方法是非常常見的,受保護或程序包級訪問允許這樣做。
在我看來,protected
修飾符比封裝代碼的執行機制更像文檔功能。通過將方法或字段標記爲受保護的,您向其他開發人員指示相關代碼是未來版本中可能會更改的內部實現細節,而不是該類的公共API的一部分。
通過投射和反射,其他開發人員經常可以獲得您不想要的代碼。如果一個方法調用在被其他類調用時可能有害,那麼解決方案就是不要嘗試使用Java的訪問規則將其鎖定。這是爲了重構類,以支持不可變的數據結構和清晰的關注點分離。
可能的重複[爲什麼Java中的「protected」修飾符允許訪問同一個包中的其他類?](http://stackoverflow.com/questions/902922/why-does-the-protected-modifier-in -java-允許訪問到其他類功能於同) –