Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java的替代品';什么是可观测类?_Java_Events_Observer Pattern_Observable - Fatal编程技术网

Java的替代品';什么是可观测类?

Java的替代品';什么是可观测类?,java,events,observer-pattern,observable,Java,Events,Observer Pattern,Observable,我是从C#world来到Java的,在C#world中,Observer模式被实现为带有事件关键字的一流语言结构 我看到Java从早期就有了可观察的类,但它显然存在实现问题,而且似乎没有被广泛使用。到目前为止,我只是在Java代码中滚动我自己的Observer模式实现,但我总是忍不住认为除了总是生成这个样板代码之外,肯定还有更好的替代方案。Swing中有侦听器类,但它们似乎不适合非Swing代码 对于这个非常常见的问题,推荐的解决方案是什么?第三方库对我来说没问题。展示了使用Spring框架的模

我是从C#world来到Java的,在C#world中,Observer模式被实现为带有
事件
关键字的一流语言结构

我看到Java从早期就有了
可观察的
类,但它显然存在实现问题,而且似乎没有被广泛使用。到目前为止,我只是在Java代码中滚动我自己的Observer模式实现,但我总是忍不住认为除了总是生成这个样板代码之外,肯定还有更好的替代方案。Swing中有侦听器类,但它们似乎不适合非Swing代码


对于这个非常常见的问题,推荐的解决方案是什么?第三方库对我来说没问题。

展示了使用Spring框架的模式的一个很好的实现。您仍然需要定义Subject和Observer接口(以及实现),但是Spring通过XML配置处理对Subject的观察者注册。

通常,观察者模式在需要时使用特别的解决方案来实现。说到行为模式,它是最简单的方法之一:两种方法控制“观察者”列表,一种方法在发生有趣的事情时通知观察者

观察者模式往往很少出现在某些领域之外,当它出现时,它往往过于特定于应用领域,因此通用解决方案没有什么价值。您可以看到
java.util.Observable
类的问题:如果您从
Observable
继承,您必须接受可能传递给您的每一种可能的“观察者”,这可能对您的应用程序没有意义:

  • 如果您的对象可以生成两种不同类型的事件,因此需要两个不同的观察者列表,该怎么办
  • 如果观察员可能会根据事件影响您的目标,例如通过否决变更,该怎么办
这就是说,通过采取完全不同的方法,似乎在简化事件生成和处理方面做得相当好


其他的。我建议调查一下。据我所知,Java只有一个实现:。

为什么监听器类不适合非Swing代码?似乎所有EventListener派生的接口和类都在Swing和AWT包中。因为它们在一个负责UI的包中,所以将它们用于非UI对我来说似乎是一种不好的味道。EventListener是否在这些UI上下文之外使用?谁来阻止您派生自己的侦听器类
EventListener
EventObject
都在
java.util
中,它们都不以任何方式绑定到AWT或Swing。
EventListener
接口非常无用。它没有声明任何方法。谢谢你的回答。我不确定您关于泛型观察者解决方案没有什么价值的说法,尽管我可以看到这个论点适用于Java的观察者实现。再次提到C#,Observer在.NET中大量使用的
事件
结构中是一级公民。我认为泛型观察器必须正确地实现,也许它确实需要一种语言结构来实现。是的,需要一种语言结构。例如,如果您有
N
不同类型的事件,则必须使用
N
组管理事件侦听器的方法来扩充该类。但是Java语言库不能在使用它的类中添加任意数量的方法。util的主要问题是,在大型应用程序中,线程、死锁和性能变得疯狂。我们的应用程序采用了“甚至公交车”的方式。非常好的建议,谢谢。我最近开始在我的C#开发中使用反应式扩展,这非常令人印象深刻。