vue 侦听器侦听对象属性_不删除侦听器–使用ListenerHandles

vue 侦听器侦听对象属性

听一个可观察的实例并对它的变化做出React很有趣。 做一些必要的事情来打断或结束这种聆听会变得很有趣。 让我们看看问题的根源和解决方法。

总览

这篇文章将首先讨论这种情况,然后再讨论常见的方法和问题所在。 然后,它将提供解决大多数问题的简单抽象。

尽管示例使用Java,但许多其他语言也存在缺陷。 提出的解决方案可以应用于所有面向对象的语言。 那些懒于自己在Java中实现抽象的人可以使用LibFX

情况

由Ky Olsen在CC-BY 2.0下发布。

由Ky Olsen在CC-BY 2.0下发布 。

假设我们想听听属性值的变化。 这很简单:

不支持删除的简单案例

private void startListeningToNameChanges(Property<String> name) {name.addListener((obs, oldValue, newValue) -> nameChanged(newValue));
}

现在假设我们要在特定间隔内中断监听或完全停止监听。

保持参考

解决此问题的最常用方法是保留对侦听器的引用,并保留对周围属性的引用。 根据具体的用例,实现会有所不同,但是它们都可以归结为以下形式:

默认方式删除侦听器

private Property<String> listenedName;
private ChangeListener<String> nameListener;...private void startListeningToNameChanges(Property<String> name) {listenedName = name;nameListener = (obs, oldValue, newValue) -> nameChanged(newValue);listenedName.addListener(nameListener);
}private void stopListeningToNameChanges() {listenedName.removeListener(nameListener);
}

尽管这看起来不错,但我确信这实际上是一个糟糕的解决方案(尽管是默认解决方案)。

首先,额外的引用使代码混乱。 很难让他们表达出为什么要留在身边的意图,因此它们降低了可读性。

其次,它们通过向类添加新的不变式来增加复杂度:该属性必须始终是添加了侦听器的属性。 否则,对removeListener的调用将无提示地执行任何操作,并且在将来的更改时仍将执行该侦听器。 放开这可能是讨厌的。 如果类很短,则坚持不变性是容易的,但如果变得越来越复杂,则可能成为问题。

第三,引用(特别是该属性的引用)邀请与它们进行进一步的交互。 这可能不是故意的,但没有任何办法阻止下一个开发人员继续这样做(请参阅第一点)。 如果有人确实开始对该物业进行操作,第二点将成为非常现实的风险。

这些方面已经使它不能成为默认解决方案。 但是还有更多! 在许多类中必须这样做会导致代码重复。 最后,上面的实现包含一个竞争条件。

侦听器句柄

大多数问题来自直接在需要中断/结束侦听的类中处理可观察对象和侦听器。 这是不必要的,所有这些问题都可以通过一个简单的抽象来解决: ListenerHandle

ListenerHandle

public interface ListenerHandle {void attach();void detach();
}

ListenerHandle保留对可观察对象和侦听器的引用。 在调用attach()detach()它会将侦听器添加到可观察对象或将其删除。 为了将此语言嵌入语言,当前将侦听器添加到可观察对象的所有方法都应返回该组合的句柄。

现在剩下要做的就是为所有可能的情况实际实现句柄。 或者说服那些开发您喜欢的编程语言的人来做。 这留给读者练习。

注意,这解决了上面提到的所有问题,除了争用条件之外。 有两种方法可以解决此问题:

  • 处理实现可能本质上是线程安全的
  • 可以实现一个同步装饰器

LibFX中的ListenerHandles

作为Java开发人员,您可以使用LibFX ,它支持三个级别的侦听器句柄。

功能了解ListenerHandles

添加侦听ListenerHandle时, LibFX的所有可实现此功能而不会与Java API冲突的功能都会返回ListenerHandle

以WebViewHyperlinkListener为例:

将“ ListenerHandle”获取到“ WebViewHyperlinkListener”

WebView webView;ListenerHandle eventProcessingListener = WebViews.addHyperlinkListener(webView, this::processEvent);

JavaFX实用程序

由于LibFX与JavaFX有紧密的联系(可能会想到!),它提供了一个实用程序类,该类将侦听器添加到可观察对象并返回句柄。 这适用于JavaFX中存在的所有可观察/侦听器组合。

例如,让我们看一下ObservableValue<T> / ChangeListener<? superT>的组合ChangeListener<? superT> ChangeListener<? superT>

'ListenerHandles'中的一些方法

public static <T> ListenerHandle createAttached(ObservableValue<T> observableValue,ChangeListener<? super T> changeListener);public static <T> ListenerHandle createDetached(ObservableValue<T> observableValue,ChangeListener<? super T> changeListener);

ListenerHandleBuilder

在所有其他情况下,即对于上面未涵盖的任何可观察/侦听器组合,可以使用构建器来创建手柄:

为自定义类创建“ ListenerHandle”

// These classes do not need to implement any special interfaces.
// Their only connection are the methods 'doTheAdding' and 'doTheRemoving',
// which the builder does not need to know about.
MyCustomObservable customObservable;
MyCustomListener customListener;ListenerHandles.createFor(customObservable, customListener).onAttach((obs, listener) -> obs.doTheAdding(listener)).onDetach((obs, listener) -> obs.doTheRemoving(listener)).buildAttached();

React式编程

尽管这不是关于React式编程的文章 ,但仍应提及。 查看ReactiveX (用于许多语言,包括Java,Scala,Python,C ++,C#和更多语言)或ReactFX (或此介绍性文章 )以了解一些实现。

反射

我们已经看到,从可观察对象中删除侦听器的默认方法会产生许多危害,需要避免。 侦听器句柄抽象提供了解决许多问题的干净方法,而LibFX提供了一种实现。

翻译自: https://www.javacodegeeks.com/2015/01/dont-remove-listeners-use-listenerhandles.html

vue 侦听器侦听对象属性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华硕笔记本桌面没有显示计算机,华硕笔记本的桌面不见了,急求高手解答

满意答案下放工人2013.04.06采纳率&#xff1a;54% 等级&#xff1a;12已帮助&#xff1a;5701人★桌面&#xff0d;点击鼠标右键&#xff0d;点击排列图标&#xff0d;点击显示桌面图标★在桌面上右键点击→“属性”→桌面项→左下有个“自定义桌面”进入设置&#xff0c;把…

Facebook开源 C++11 组件库,真香!

Folly是Facebook open source library的缩写&#xff0c;提供了类似 Boost 和 std 库的功能。包括散列、字符串、向量、内存分配、位处理等&#xff0c;满足大规模高性能的需求。逻辑设计Folly 是一组相对独立的组件&#xff0c;有的简单到几个符号。对内部依赖没有限制&#x…

undertow ssl_SSL与WildFly 8和Undertow

undertow ssl我一直在研究WildFly 8的一些安全性主题&#xff0c;偶然发现了一些没有很好记录的配置选项。 其中之一是用于新的Web子系统Undertow的TLS / SSL配置。 有很多关于较旧的Web子系统的文档&#xff0c;并且确实仍然可以使用&#xff0c;但是这里是使用新方法进行配置…

C++对象的动态建立

C对象的动态建立和释放在C中&#xff0c;如果定义的对象是静态的&#xff0c;在程序运行过程中&#xff0c;对象所占的空间是不能随时释放的。为提高内存空间的利用率&#xff0c;希望在需要用到对象时才建立对象&#xff0c;在不需要用该对象时就撤销它&#xff0c;释放它所占…

java字符连接字符串数组_Java中连接字符串的最佳方法

java字符连接字符串数组最近有人问我这个问题–在Java中使用运算符连接字符串是否对性能不利&#xff1f; 这让我开始思考Java中连接字符串的不同方法&#xff0c;以及它们如何相互对抗。 这些是我要研究的方法&#xff1a; 使用运算符 使用StringBuilder 使用StringBuffer…

C 构造函数重载

C 用参数初始化表对数据成员初始化在C 中&#xff0c;构造函数的函数可以通过体内赋值语句对数据成员实现初始化&#xff0c;C 还提供另一种初始化数据成员的方法&#xff0c;用参数初始化表来实现对数据成员的初始化。这种方法不在函数体内对数据成员初始化&#xff0c;而是在…

乐播投延迟很高_大屏也要高刷新!华为4K@120智慧屏初体验,屏幕软件都够硬

买电视就是买屏幕&#xff0c;华为智慧屏也不例外。可参数大而全的旗舰产品往往都有着相当高昂的售价&#xff0c;假如你不愿意将就千元级别的画质&#xff0c;希望电视能坚持更长时间&#xff0c;却又没有足以点满所有技能树的预算……华为新出的S系列智慧屏&#xff0c;大概正…

java常见性能优化_十大最常见的Java性能问题

java常见性能优化Java性能是所有Java应用程序开发人员都关心的问题&#xff0c;因为快速使应用程序与使其正常运行同等重要。 史蒂文海恩斯&#xff08;Steven Haines&#xff09;使用他在Java性能问题上的个人经验得出的结论是&#xff0c; 大多数问题都有共同的根本原因 。 因…

为甚 html 显示为源码,显示字符串作为美化HTML源代码

我正在开发一个ASP.NET MVC Web应用程序。在一个页面上&#xff0c;我有一个字符串&#xff0c;如下所示&#xff1a;This is some text !对于预览模式&#xff0c;我使用Html.Raw(Model.MyText)&#xff0c;文本显示为呈现的HTML&#xff1a;此是一些文字&#xff01;我现在想…

C语言 | 链表概述

C语言链表概述链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构&#xff0c;是根据需要开辟内存单元。链表有一个“头指针”变量&#xff0c;它存放一个地址&#xff0c;该地址指向一个元素。链表中每一个元素称为“结点”&#xff0c;每个结点都应包括两个部…

jooq_jOOQ与Hibernate:何时选择哪个

jooqHibernate已成为Java生态系统中的事实上的标准&#xff0c;事实上&#xff0c; 如果标准对您很重要 &#xff0c;并且如果您将JCP与ISO&#xff0c;ANSI&#xff0c;IEEE等置于同一级别&#xff0c;那么Hibernate也是实际的JavaEE标准实现。 本文的目的不是讨论标准&#…

C语言 | 循环语句总结

C语言循环的嵌套一个循环体内又包含另一个完整的循环结构&#xff0c;称为循环的嵌套。内嵌的循环体中还可以嵌套循环&#xff0c;这就是多层循环。3种常用循环语句&#xff1a;while语句、do...while语句和for语句可以相互嵌套。C语言循环的比较3种循环语句都可以用来处理同一…

账户的配置使您无法使用该计算机,2个方法解决“user profile service服务未能登录无法加载用户配置文件”...

win8/10系统&#xff1a;启动电脑显示windows标志时&#xff0c;长按电源键强行关机&#xff0c;重复此操作三次&#xff0c;系统将会进入“自动修复”。然后在“自动修复”界面中&#xff0c;选择“高级选项”>“疑难解答”>“高级选项”>“启动设置”>“重启”&a…

C语言 | 内部与外部函数

C语言函数的声明和定义一个函数一般由两部分组成&#xff1a;声明部分执行语句C语言对变量而言&#xff0c;声明与定义的关系稍微复杂一些&#xff0c;在声明部分出现的变量有两种情况&#xff1a;一种是需要建立存储空间的。另一种是不需要建立存储空间的。前者称为定义性声明…

获取客户端ip_代理IP工具能否解决反爬?

互联网已成了生活中的部分&#xff0c;从事互联网的工作者&#xff0c;避免不了需要去一些网站上进行爬取需要的数据来达到自己产品或者业务上的需求。比如反爬策略&#xff0c;但是&#xff0c;使用代理IP工具一定可以解决反爬虫策略吗&#xff1f;一、不同的网站有不同的反爬…

C语言 | 结构体数组

C语言结构体数组概述一个结构体变量中可以存放一组有关联的数据&#xff0c;如一个学生的学号、姓名、成绩等数据&#xff0c;如果有10个学生的数据需要参加运算&#xff0c;显然应该用数组&#xff0c;这就是结构体数组。结构体数组与之前介绍的数值型数组的不同之处在于每个数…

html弹窗代码y\/n,Nodejs扩展,实现消息弹窗(示例代码)

模块的C代码 node_gtknotify.cc#include #include #include #include #include using namespace v8;class GtkNotify : node::ObjectWrap{public:GtkNotify(){}~GtkNotify(){}std::string title;std::string icon;static Persistent persistent_function_template;static void …

C语言 | 结构体指针

C语言指向结构体变量的指针在C语言中&#xff0c;指向结构体对象的指针变量既可以指向结构体变量&#xff0c;也可指向结构体数组中的元素。指针变量的基类型必须与结构体变量的类型相同。C语言中允许 &#xff08;*p&#xff09;.num用p->num来代替 ->代表一个箭头 p-&g…

C语言 | 变量的存储方式

C语言动态存储方式与静态存储方式静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式&#xff1b;动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式。内存中的供用户使用的存储空间可以分为3部分&#xff0c;程序区静态存储区动态存储区全局变量…

设计模式装饰者模式_装饰者模式如何拯救了我的一天

设计模式装饰者模式在工作中&#xff0c;我正在处理庞大的Java代码库&#xff0c;该代码库是由许多不同的开发人员在15年的时间里开发的。 并不是所有的事情都由书来完成&#xff0c;但是同时我通常无法重构遇到的每一个奇怪的事物。 尽管如此&#xff0c;仍可以每天采取提高代…