2013-11-26 43 views
7

這是不是真的,一個public變量的類被認爲是弱的封裝,這不是一個糟糕的設計實踐?爲什麼java.awt.Dimension具有公共變量?

如果是這樣的話爲什麼java.awt.Dimension有2個公共變量widthheight

+0

我認爲即使它確實有這樣的公共領域應該使用getter。 – Willmore

+0

@MariusŽilėnas:你...但是讓變量公開的原因是什麼? –

+1

恕我直言,你將不得不問原作者 – 2013-11-26 06:29:50

回答

3

我認爲暴露公有領域並不違反封裝本身。封裝是實體的屬性,它將內部隱藏起來的是一個複雜的內部結構。這種複雜的結構不能直接訪問,因此不會冒險被破壞。它只能通過公共方法訪問,這使得它們的工作很好,並且不會破壞複雜的內部結構。例如,我們無法直接訪問HashMap的散列表,我們不能破壞它。我們只使用getput方法,正確處理散列表狀態。但是Dimension對象的複雜結構在哪裏?當我們寫d.width = 23時什麼東西壞了?

我認爲在這種情況下,有理由使用公共getter/setter而不是公有字段:品味和約定。後者更重要,我想。但是這也取決於我們在何處以及爲什麼應用這些約定。

+0

我完全同意你的看法。非常感謝你說清楚。相反,把它歸咎於一個非常古老的代碼,你已經解釋了getter和setter的目的。 +1 –

0

Dimension已經存在很長時間了,在Java的早期,對性能有着真正的關注。所以他們使用公共變量並使其變得可變 - 兩個主要錯誤,僅僅是爲了獲得幾個時鐘週期。

所有你們提出關於過早優化的問題都可以在這裏學到一個好教訓。 (已添加)

尺寸變化很大(因爲窗口已調整大小),並且通過使其變得可變,您可以「節省」分配新對象 - 只需重新使用舊對象。在Java的早期,這是有道理的。另外,當GUI在框架內的組件中繪製嵌套按鈕時,它們被訪問了很多,因此,爲了在重繪中節省幾個週期,不要使用函數調用。再次,有一點道理。

現在的問題是,現在所有的多核處理器和多線程代碼,你經常需要製作一個Dimension的防禦副本。失去所有的「advntage」,再加上煩人和bug的來源。

+0

thx的迴應.. :)但我有疑問你是否說在更早的階段維度有'公共最終高度'?如果我的問題聽起來很荒謬,我很抱歉,但我想不出除了'final'之外,讓一個領域不可變。 –

+0

我在第一次編輯時遇到了錯字。這個類一直是可變的,有非final字段,可以「保存」對象的創建。國際海事組織,他們應該使這個類不可變,最終變量。 – user949300

+0

我剛剛發現這個[** link **](http://web.mit.edu/java_v1.0.2/www/apibook/javag9.htm)由@ashatte提供,其中'java.awt.Color' has公共最終變量。我相信'Dimension'和'Color'都是同時編碼的,爲什麼他們沒有在'Dimension'中做最後的確定? –

1

如果你看一下Java文檔尺寸: http://docs.oracle.com/javase/7/docs/api/java/awt/Dimension.html

您將看到公共領域一直存在,因爲1.0(1996年)。這種語言已經發展到適應許多原則和最佳實踐,成爲今天的語言。這包括對1.1版本的AWT模型進行重新編寫,其中包括爲這些字段添加的訪問器和增變器。

下面是對JDK 1.1版本的一些歸檔的發行說明: http://www.cis.upenn.edu/~bcpierce/courses/629/jdkdocs/guide/awt/HowToUpgrade.html

從中此爲引用:

「這些變化有可能使程序,如GUI構建器和 JavaBeans-使用程序查詢組件以確定組件的屬性。「

+0

感謝您的回覆。但如果你可以看看這個[** link **](http://web.mit.edu/java_v1.0.2/www/apibook/javag9.htm),你可以看到'java.awt.Color'與Dimension類一起發佈,並且它具有可用的增變器。那麼爲什麼'Dimension'沒有變量作爲'final'? –

+0

java.awt.Color字段是靜態的,而維度字段不是。關於爲什麼java.awt.Color方法是公開的問題是一個完全不同的問題。 –

+0

我的不好...我沒有注意到'靜態的... –

相關問題