JavaFX技巧23:节省内存! 属性的阴影场

Java 8中引入的属性和属性绑定是非常有用的编程概念。 当您开发用户界面时,它们特别有用。 实际上,它们是如此有用,以至于开发人员成为所有事物都应该是属性而不是原始属性的想法的受害者。 不幸的是,他们很容易忘记,诸如SimpleLongProperty之类的属性比诸如Long的标准类型要大得多。 当然,它们比诸如long的原始数据类型大得多。

在我当前的项目之一中,客户端使用的每个模型对象几乎都是由属性组成的。 对于许多这些模型对象,这是正确的方法,因为它们将通过JavaFX控件进行编辑/修改。 但是,还有许多未编辑的模型对象。 它们的存在是为了支持FlexGanttFX控件中计划的呈现。 这些对象不需要被观察,因此它们不需要提供属性……但是它们却这样做了,因为这样做,它们浪费了很多内存。

解决此问题的一种方法是重构模型类并摆脱所有属性,但是同样,我们可能想在以后的发行版中的不同上下文中使用这些对象,然后可能需要属性,因为我们要编辑它们直。 该怎么办?

暗影场

解决这个问题的方法是我最近看到Gerrit Grunwald在其Medusa项目的代码中所做的事情,以及Properties先生本人Michael Heinrichs 描述的一种模式 。 该模式使用的“影子字段”与属性中包装对象的类型相同。 使用此模式时,仅在确实需要时才创建属性(“有人请求时”)。

在此示例中,我们要管理一个名为“ title”的属性。 我们需要一个setter,一个getter和属性访问器。

private String _title = "Untitled"; // shadow field

private 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 constructor
        title = 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值