JavaFX技巧23:节省内存! 属性的阴影场
Java 8中引入的屬性和屬性綁定是非常有用的編程概念。 當您開發用戶界面時,它們特別有用。 實際上,它們是如此有用,以至于開發人員成為所有事物都應該是屬性而不是原始屬性的想法的受害者。 不幸的是,他們很容易忘記,諸如SimpleLongProperty之類的屬性比諸如Long的標準類型要大得多。 當然,它們比諸如long的原始數據類型大得多。
在我當前的項目之一中,客戶端使用的每個模型對象幾乎都是由屬性組成的。 對于許多這些模型對象,這是正確的方法,因為它們將通過JavaFX控件進行編輯/修改。 但是,還有許多未編輯的模型對象。 它們的存在是為了支持FlexGanttFX控件中計劃的呈現。 這些對象不需要被觀察,因此它們不需要提供屬性……但是它們卻這樣做了,因為這樣做,它們浪費了很多內存。
解決此問題的一種方法是重構模型類并擺脫所有屬性,但是同樣,我們可能想在以后的發行版中的不同上下文中使用這些對象,然后可能需要屬性,因為我們要編輯它們直。 該怎么辦?
暗影場
解決這個問題的方法是我最近看到Gerrit Grunwald在其Medusa項目的代碼中所做的事情,以及Properties先生本人Michael Heinrichs 描述的一種模式 。 該模式使用的“影子字段”與屬性中包裝對象的類型相同。 使用此模式時,僅在確實需要時才創建屬性(“有人請求時”)。
例
在此示例中,我們要管理一個名為“ title”的屬性。 我們需要一個setter,一個getter和屬性訪問器。
private String _title = "Untitled"; // shadow fieldprivate StringProperty title;public final String getTitle() {title == null ? return _title : title.get(); }public final void setTitle(String newTitle) {if (title == null) {_title = newTitle;} else {title.set(newTitle);} }public final StringProperty titleProperty() {if (title == null) {/// !!!! pass shadow field to constructortitle = new StringProperty(this, "title", _title); ?}return title; }通過使用這種模式,我可以將項目中特定用例的內存占用空間從310 MB減少到250 MB。 保存的內存是我學生時計算機總內存的十倍。 想想看!
翻譯自: https://www.javacodegeeks.com/2016/03/javafx-tip-23-save-memory-shadow-fields-properties.html
總結
以上是生活随笔為你收集整理的JavaFX技巧23:节省内存! 属性的阴影场的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jmx 复用 jmx_JMX:一些入门说
- 下一篇: JLBH – Java延迟基准线束介绍