Java 如何为对象创建自定义操作?
我有一个对象,比如FOO,有一个变量,百分比 我需要创建一个Action percentChanged,它将在变量percent更改时触发,由另一个对象中的ActionListener处理 如何在java中实现它?我认为您需要 结帐和我想你需要这个Java 如何为对象创建自定义操作?,java,Java,我有一个对象,比如FOO,有一个变量,百分比 我需要创建一个Action percentChanged,它将在变量percent更改时触发,由另一个对象中的ActionListener处理 如何在java中实现它?我认为您需要 结帐和我想你需要这个 签出和操作监听器接口只有actionPerformed方法,因此可以通过创建您自己的监听器接口并让您的Foo类通知注册的监听器来实现您试图完成的任务 例如,可以创建一个名为PercentChangeListener的新接口: interface Pe
签出和操作监听器接口只有
actionPerformed
方法,因此可以通过创建您自己的监听器接口并让您的Foo
类通知注册的监听器来实现您试图完成的任务
例如,可以创建一个名为PercentChangeListener
的新接口:
interface PercentChangeListener {
public void percentChanged();
}
然后,Foo
类可以有方法注册PercentChangeListener
s,当百分比发生变化时应通知该监听器:
class Foo {
// Percentage.
private Percent percent;
// Listeners which should be notified of a change to the percentage.
private List<PercentageChangeListener> listeners;
// Adds a listener that should be notified.
public void addListener(PercentageChangeListener listener) {
listener.add(listener);
}
// Notifies all the listeners which should be told that the percentage
// has changed.
private void notifyListeners() {
for (PercentageChangeListener listener : listeners) {
listener.percentChanged();
}
}
// Some process which changes the percentage.
private void someProcess() {
percent.change();
notifyListeners();
}
}
以上是未经测试的代码,但应该给出可以采取的方法。操作监听器接口只有
actionPerformed
方法,因此,可以通过创建您自己的侦听器接口并让您的Foo
类通知注册的侦听器来实现您试图实现的功能
例如,可以创建一个名为PercentChangeListener
的新接口:
interface PercentChangeListener {
public void percentChanged();
}
然后,Foo
类可以有方法注册PercentChangeListener
s,当百分比发生变化时应通知该监听器:
class Foo {
// Percentage.
private Percent percent;
// Listeners which should be notified of a change to the percentage.
private List<PercentageChangeListener> listeners;
// Adds a listener that should be notified.
public void addListener(PercentageChangeListener listener) {
listener.add(listener);
}
// Notifies all the listeners which should be told that the percentage
// has changed.
private void notifyListeners() {
for (PercentageChangeListener listener : listeners) {
listener.percentChanged();
}
}
// Some process which changes the percentage.
private void someProcess() {
percent.change();
notifyListeners();
}
}
上面的代码未经测试,但应该给出可以采取的方法。为什么不使用PropertyChangeListener呢。这就是Java bean的工作方式。为什么不使用PropertyChangeListener呢。这就是Java bean的工作方式。您需要扩展EventListener,因为在接口PercentChangeListener扩展EventListener中,我将实现percentChanged以接受事件对象或百分比的新旧值。这样,通知的客户端不需要回调事件源来读取新的百分比值。我还建议使用CopyOnWriteArrayList保存您的听众列表。这避免了当侦听器尝试从percentChanged回调中删除iself时引发ConcurrentModificationException。您需要像在接口PercentChangeListener Extended EventListener中一样扩展EventListener我将实现percentChanged以接受事件对象或百分比的新旧值。这样,通知的客户端不需要回调事件源来读取新的百分比值。我还建议使用CopyOnWriteArrayList保存您的听众列表。这避免了当侦听器试图从percentChanged回调中删除自己时引发ConcurrentModificationException。真的,不要使用
Observer
和Observable
。哼,为什么?你能给我一篇文章解释为什么不应该使用这些吗?我和汤姆在一起。Observable是一个混乱的类,因为您最终需要向下转换,而Observable是一个必须扩展的具体类,这并不总是可能的。至少通过PropertyChangeListener方法,您可以更干净地处理primities,并被告知属性的名称。真的,不要使用Observer
和observatable
。哼,为什么?你能给我一篇文章解释为什么不应该使用这些吗?我和汤姆在一起。Observable是一个混乱的类,因为您最终需要向下转换,而Observable是一个必须扩展的具体类,这并不总是可能的。至少通过PropertyChangeListener方法,您可以更干净地处理primities,并被告知属性的名称。当问题如此简单时,这是我首选的方法。如果事件流更复杂的话,我会使用coobird的解决方案。PCL几乎可以肯定是解决问题的方法——它还可以轻松地与绑定库集成(请参阅Better Beans binding)。当问题如此简单的时候,这是我的首选方法。如果事件流更复杂的话,我会使用coobird的解决方案。PCL几乎可以肯定是其中的一种方式——它还可以方便地与绑定库集成(请参阅Better Beans binding)