2010-02-22 36 views
15

Java本身支持C#等屬性嗎?或者,當使用Java進行編碼時,當試圖封裝變量時,您有限制的做法是通過getVariable()setVariable()有點方法嗎?Java和類C#屬性

感謝

回答

18

沒有

您不必屬性的Java語言的概念。你需要使用getter和setter ..

+2

幾乎:您沒有語言級別的支持,但屬性在Java bean規範中是一個明確定義的概念,並且是通過其getter/setters定義的。 – 2010-02-22 17:21:27

+2

感謝您補充這一點,但我認爲在這個問題上正在談論語言Jave。 – stiank81 2010-02-22 17:22:47

+1

我同意這個假設。但是,我仍想避免給人留下這樣的印象:在所有Java(平臺)中都沒有任何特性。雖然Java(語言)不支持它,但在平臺中這不是一個未知的事情。 – 2010-02-22 17:23:58

2

我上次檢查時,Java不支持屬性。

4

Java不支持類似C#的屬性。您需要getter和setter,但要小心您不會無意中通過返回對該對象的引用而不是對其副本的引用來讓用戶訪問封裝的數據。

+0

你提倡這個: object x = something.getX(); if(x.equals(something.getX())){ //不可能發生 } – brian 2010-02-22 17:24:20

+0

嗯,我明白了。所以當我從吸氣劑回來時,我應該總是做很深的變量副本嗎? – 2010-02-22 17:24:51

+2

不,只有在外面改變是不安全的。 對於像'int'這樣的原始類型,你可以創建一個沒有setter的getter來保護你的變量。但是如果你從你的getter返回一個引用類型(比如說一個集合),那麼這個對象的內部狀態就可以在外面被操作了(類似於member.getFriends()。clear())如果你買不起,返回一個副本(或只讀包裝器)。 – 2010-02-22 17:36:52

4

正如其他人所說,沒有Java本身沒有屬性。接受的方法是使用getters和setter。在附註中,Delphi支持與C#非常相似的屬性。

在Java中絕對不支持AutoProperties。似乎沒有提及任何未來的支持。

0

C#屬性與Delphi屬性相似,原因很簡單,它們受Delphi屬性的啓發。 讓Borland德爾菲團隊的關鍵人物之一轉移到微軟和(幫助)設計C#當然沒有任何關係:)

去年有一個提案(事實上有幾個)用於添加C#風格屬性到Java,但是那些被社區有效擊落的僅僅是語法糖,沒有真正的附加價值。

+5

我認爲語法糖是一件好事.. – 2010-02-23 16:36:37

+0

不必要的。很多事情只是使更多的混淆。 tbh我非常喜歡C#中的屬性,但是我可以明白爲什麼它可能會導致在訪問成員與其getter/setter之間的調用代碼時無法區分的問題。 如果我有一個派生類,例如我可能想繞過getter/setter,並在某些情況下直接訪問類成員,例如在重寫的getter或setter或出於性能原因。 – jwenting 2010-03-04 13:26:22

+2

看起來在很多情況下,簡單的getter和setter可以使類真正需要的代碼行加倍。 – 2012-07-10 21:58:01