我正在寫一個遊戲,我有一個輸入類,其中包含所有不同鍵的布爾值。我在主遊戲類中創建了這個類的一個實例。布爾人是公開的,還是應該使用訪問者訪問它們?在非靜態類中使用公共變量很糟糕嗎?
回答
而不是每個鍵boolean
的,它會更容易閱讀和編寫,如果你有一個private Map<String, Boolean> keyStates
,所有按鍵被初始化爲false
。那麼你的訪問者可能是:
public void setPressed(String keyName) {
keyStates.put(keyName, true);
}
public void setReleased(String keyName) {
keyStates.put(keyName, false);
}
public boolean isPressed(String keyName) {
return keyStates.get(keyName);
}
具有存取方法,而不是公共變量一般的原因是,它允許類來更改它的實現,而不需要在與會員的互動類的變化。例如,通過上述操作,您現在可以添加代碼來計數或記錄按鍵,或者更改所用的基礎類型Map
,而不會將這些內容暴露給外部。
這是不是個人偏好。 Encapsulation和Interfaces是面向對象軟件工程的組成部分,並且是從技術POV中實現互聯網的主要設計原因。
謝謝!這看起來像一個非常好的方法。 – user1150769 2012-03-12 16:36:55
標準做法是使用遵循java bean約定的getter/setter來使成員變量保護或私有。這往往有些冗長,但有一個非常好的庫(www.projectlombok.org),它爲你生成了getters/setters/constructors/toString/hashCode/equals方法。
一般來說,我會建議使用getter和setter,因爲它更乾淨,更有組織,更具可讀性。如果你有很多不同的程序員在查看你的代碼,這也會有所幫助。我的觀點是總是讓你的變量是私人的,除非你需要公開他們的具體原因。如果性能在你的遊戲中確實是一個問題,那麼通過減少函數調用來公開你的變量會有所幫助。
將類變量聲明爲私有並使用公共getter和setter方法訪問它們總是一種很好的java編程習慣,除非它真的需要將它們聲明爲public。
如果您使用的是IDE,那麼只需單擊一下即可爲類變量/成員變量生成getter和setter。
這並不糟糕,但通常你會想要一個對象的狀態爲encapsulate。
這主要是個人品味的事情 - 我相信你會發現人們爭論雙方,我會說這不是黑人或白人,而是取決於班級的「大」。
使用getter和setter的基本原理是,您可以將實際的表示形式抽象爲一個字段,以便您可以自由地開始將其呈現爲例如。派生的值,而不會更改您的界面。所以真正歸結爲這個類的接口對你有多寶貴。
如果它是您的一流公共接口的一部分,那麼一定要使用getters和setter。另一個極端,如果它是一個簡單的數據持有者,就像一個單獨使用一個類的元組一樣(例如在轉換到另一個類之前映射數據庫行),那麼我會毫不猶豫地使用字段;接口沒有實際價值,因爲它只在內部使用。
那麼有多少類/包會使用這個類?如果這是一個私人的「本地」課程,那麼我認爲僅僅使用這些字段並沒有任何問題,並且如果需要更改,請更新您的調用者。
訪問字段更容易證明,如果他們也是final
也是如此,這種情況通常就是這種情況。
現在你已被反覆告知使用getter和setter,並且因爲你使用的是Java(IDE可以幫助你簡單地使getter/setter成爲getter/setter,並且每個人都清楚地使用它們),請閱讀本主題以獲得幫助添加一些平衡,你對他們的用法:
- 1. 公有變量是不是很糟糕?
- 2. PHPExcel公式變得很糟糕
- 3. 在公共靜態類中使用公共靜態類時出現異常
- 4. 公共靜態變量或使用意圖類的putExtra方法
- 5. 在git中創建並刪除大量分支很糟糕嗎?
- 6. 在MVC中使用會話對象,它真的很糟糕嗎?
- 7. 在多線程中共享數據 - 是非靜態變量嗎?
- 8. 使用JMockit抽象類中的非公共靜態方法?
- 9. 蘭特()真的很糟糕嗎?
- 10. 同一類中的Java靜態變量和非靜態變量
- 11. 在靜態內部類中引用非靜態變量
- 12. 訪問公共靜態變量
- 13. System.setProperty或公共靜態變量?
- 14. 非確定性運行時間真的很糟糕嗎?
- 15. 「公共靜態」還是「靜態公共」?
- 16. UIView的變換看起來很糟糕
- 17. 在ruby中直接使用實例變量是不是很糟糕?
- 18. Android中公共靜態變量的使用情況
- 19. 導入的java類中的公共靜態final變量
- 20. 在Java中的非靜態類中聲明靜態變量
- 21. 公共類與相同類的私有靜態變量
- 22. 我可以在java的靜態方法中使用非靜態變量嗎?
- 23. 如何在靜態NestedClass中使用非靜態的OuterClass變量?
- 24. 在非靜態類中鎖定靜態變量是否安全?
- 25. 你認爲它在PHP中使用類方法訪問超類全局變得很糟糕嗎?
- 26. 我可以在靜態方法在頂點使用非靜態變量嗎?
- 27. 引用非靜態變量
- 28. 如何在擴展類公共變量中使用變量
- 29. 內存分配靜態變量在非靜態類在.net
- 30. 使用聲明公共靜態常量類成員
總是使用私有變量與setter/getters,除非你真的必須 – 2012-03-12 16:18:43
@JimmyGustafsson:爲什麼?如果getters/setter真的沒有別的辦法,只能獲取/設置值,爲什麼不讓它們公開? – 2012-03-12 16:20:16
布爾值是什麼表示_about_鍵? – paislee 2012-03-12 16:20:20