簡體   English   中英

為什么java.awt.Dimension有公共變量?

[英]Why does java.awt.Dimension have public variables?

具有public變量的類在Encapsulation中被認為是弱的並且它是不是一個糟糕的設計實踐?

如果是這種情況,為什么java.awt.Dimension有2個公共變量的widthheight

我認為暴露公共領域並不違反封裝本身。 封裝是實體的屬性,隱藏在自身內部是一個復雜的內部結構。 這種復雜的結構不能直接訪問,因此不會有被破壞的風險。 它只能通過公共方法訪問,這使得它們的工作很好並且不會破壞復雜的內部結構。 例如,我們無法直接訪問HashMap的哈希表,也無法破壞它。 我們只使用getput方法,正確地關注哈希表狀態。 但是Dimension對象的復雜結構在哪里? 當我們寫d.width = 23時會發生什么事情?

在這種情況下,我認為有理由使用公共getter / setter而不是公共字段:品味和慣例。 我想,后者更重要。 但它也取決於我們應用這些約定的地點和內容。

如果你看看JavaDoc for Dimension: 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使用程序等程序可以查詢組件以確定組件的屬性。”

Dimension已經存在很長時間了,在Java的早期階段,人們對性能產生了真正的擔憂。 因此,他們使用公共變量並將其變為可變 - 兩個主要錯誤,只是為了獲得幾個時鍾周期。

所有人都在詢問有關過早優化的問題,可以在這里學到很好的教訓。 (添加)

維度變化很大(當窗口調整大小時)並且通過使其變得可變,您“保存”必須分配新對象 - 只需重用舊對象。 在Java的早期,這是有道理的。 另外,隨着GUI在Frames中的組件內繪制嵌套按鈕,他們被訪問了很多,因此,為了在重繪中保存幾個周期,不要使用函數調用。 再一次,有點意義。

問題在於,如今所有的多核處理器和多線程代碼都會讓你經常制作一個Dimension的防御性副本。 失去所有“優點”,加上,煩人和錯誤的來源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM