Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-10, 20:48   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 MATLAB处理类对象的弱引用

在考虑在MATLAB中基于句柄类的ORM的可能性时,出现了缓存实例的问题。我无法立即想到一种制作弱引用或弱映射的方法,尽管我猜想事件监听器可能有某些缺陷。有任何想法吗?

更多信息

在MATLAB中,句柄类(与值类相对)具有引用语义。 MATLAB附带的一个示例是containers.Map类。如果实例化一个并将其传递给函数,则该函数对该对象所做的任何修改将通过原始引用可见。也就是说,它的工作方式类似于Java或Python对象引用。

像Java和Python一样,MATLAB以一种或另一种方式跟踪引用了句柄类的每个对象的对象有多少。如果没有更多内容,MATLAB知道删除对象是安全的。

弱引用是引用对象的引用,但出于垃圾回收的目的,不引用该引用。因此,如果仅剩余的对象引用是弱的,则可以将其丢弃。通常,可以将事件或回调提供给弱引用-丢弃对象时,将通知该对象的弱引用,从而允许运行清除代码。

例如,弱值映射类似于法线映射,除了将值(与键相对)实现为弱引用。弱映射类可以在每个弱引用上安排回调或事件,以便在删除引用的对象时,映射中的键/值条目也将被删除,从而使映射保持整洁。



回答:

这些特殊的引用类型实际上是语言级别的功能,您需要VM和GC才能完成这些操作。尝试在用户代码中实现它可能会流下眼泪,尤其是如果您依靠未记录的行为。 (很抱歉成为泥泞。)

您可以通过几种方式执行类似的操作。这些只是想法,而不是认可。我实际上还没有做过。

也许代替缓存本身的Matlab对象实例,您可以使用Matlab内嵌的JVM中的真实Java弱引用映射来缓存昂贵的计算结果。如果您可以相对快速地将Matlab值与Java相互转换,那将是一个成功。如果是相对平坦的数字数据,则使用Matlab的隐式转换可以快速转换诸如double []或double [] []之类的原语。

或者,您可以在Matlab级别建立常规LRU对象缓存(也许使用以哈希码为键的container.Map),在添加新对象时显式删除其中的对象。可以直接使用它,也可以向对象添加onCleanup()行为,使它们自动将自身的副本添加到固定大小的全局“最近删除的对象” LRU高速缓存中,并以外部有意义的ID为键,并在其中标记实例缓存,因此您的onCleanup()方法由于缓存过期而被删除时,不会尝试重新添加它们。然后,您可以从缓存中使用工厂方法或其他查找方法“复活”实例,而不必以昂贵的方式构造全新的实例。不过,这听起来需要做很多工作,但实际上并不是Matlab惯用的方法。



更多&回答...
poster 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 05:07


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.