Java 如何为对象创建自定义操作?

Java 如何为对象创建自定义操作?,java,Java,我有一个对象,比如FOO,有一个变量,百分比 我需要创建一个Action percentChanged,它将在变量percent更改时触发,由另一个对象中的ActionListener处理 如何在java中实现它?我认为您需要 结帐和我想你需要这个 签出和操作监听器接口只有actionPerformed方法,因此可以通过创建您自己的监听器接口并让您的Foo类通知注册的监听器来实现您试图完成的任务 例如,可以创建一个名为PercentChangeListener的新接口: interface Pe

我有一个对象,比如FOO,有一个变量,百分比

我需要创建一个Action percentChanged,它将在变量percent更改时触发,由另一个对象中的ActionListener处理

如何在java中实现它?

我认为您需要

结帐和

我想你需要这个


签出和操作监听器接口只有
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)