2009-08-18 73 views
5

我知道OOD中的經驗法則是最大限度地減少對給定對象的所有成員的訪問權限,因爲這可以合理完成。C#vs Java中的訪問修飾符最佳實踐

C#和Java似乎都實現了同一組訪問修飾符;然而,現在困擾我一段時間的東西是爲什麼Java類似乎大部分被聲明爲公共的,而C#類似乎大部分被聲明爲默認類。這些語言強加了這些差異還是有一些微妙之處,還是僅僅是一個約定或什麼?

我發現自己經常通過我的C#代碼(除了內部類,匿名類和其他類的狹義範圍和有用性外,我習慣性地將大多數類公開,除了內部類,我可能會錯過重要的事情。

+2

(所有評論與它關閉的不完整的事實有關;我刪除了它們,因爲它們現在沒有添加任何關於該問題已修復並重新打開的問題) – 2009-08-18 19:45:29

回答

1

我公開的唯一的東西是static/final變量,它們通常是常量。其他一切都是私有的,並且適當時通過getXXX()和setXXX()方法來完成訪問。 setXXX()方法也對數據執行任何驗證。如果我必須做出某種保護,我會,但我通常會避免它。

+1

顯然,自從我最初發布該問題以來,整個問題已發生變化。 .. – 2009-08-19 01:47:57

+0

是啊我投票了,因爲你的回答是正確的,然後我改變了整個事情......它在我完成打字之前實際上保存了。感謝壽! – 2009-08-19 13:27:33

5

我想你回答了你的問題。按照Joshua Bloch的說法,「經驗法則很簡單,使每個班級或成員都儘可能無法進入。」 Effective Java

0

更少的「客戶端」(其他代碼)知道你的類的內部運作,他將受益更多...簡單的抽象規則和麪向對象的基本支柱。正確答案已在上面給出:

「經驗法則很簡單,使每個班級或成員儘可能無法訪問。」 〜Joshua Bloch

6

Java's scopingC#'s scoping略有不同。

這是在C# From a Java Developer's Perspective的相同但不同的:Access Modifiers。這份文件現在有些過時,但仍然主要是相關的。

這份名單有兩個錯誤:

  1. C#的internal等同於Java的默認範圍(這是它自己的範圍內)。 C#的internal protected相當於Java的protected

另外,上面的文檔沒有提到默認訪問修飾符是什麼類,只適用於方法和屬性/變量。

作爲參考,c#中的類的默認範圍是內部的。如前所述,Java是其通常的默認範圍。

+1

因此,從我收集的內部來看,公共無障礙方面是一步。 java並沒有真正的內部公共對於通用目的是有意義的。公共對大多數c#開發沒有意義,除非您正在編寫一個用於導出的類庫。因此默認或內部適用於大多數開發人員。這聽起來正確嗎? – 2009-08-19 14:27:26

+9

C#的內部和內部保護不等於Java的默認範圍或Java的保護。 C#內部類可以從同一個程序集訪問。程序集基本上是.exes或.dlls。如果Java允許通過.jar文件訪問修飾符,這將是類似的,但是不是。 – FkYkko 2010-09-20 14:50:19