【问题标题】:Java, how to detect when a attribute of an object has changedJava,如何检测对象的属性何时发生变化
【发布时间】:2017-08-18 13:53:13
【问题描述】:

如果可以侦听对象属性值的变化,我无法从 java 文档中获取信息。假设我的对象只有一个 int 属性字段。我需要立即执行一个动作,我的对象改变了它的状态。有可能吗?

【问题讨论】:

标签: java event-handling


【解决方案1】:

您想研究 Java 中的观察者/可观察对象。他们将允许您做您需要做的事情。

网上有很多关于它的。

这是一个小存根:http://docs.oracle.com/javase/7/docs/api/java/util/Observer.html

更多:When should we use Observer and Observable

【讨论】:

  • 您的答案似乎是我所需要的,但是在我导入 Observable 并使用 Observable 扩展我的类之后,它仍然报告我必须定义 setChanged() 方法。 Observable 不是由我的班级扩展的
  • @AlessandroSassi 您需要定义 setChanged() 才能通知观察者。这里有更多信息:stackoverflow.com/questions/7271044/observable-in-javadocs.oracle.com/javase/8/docs/api/java/util/Observable.html
  • 我没有在我的高级评论中正确表达,我还扩展了我的类中的一个类,也不能扩展 Observable...
  • @AlessandroSassi 您能否提供更多实施细节?你想做什么?
  • 我有一个在 localhost 上运行的类,其中构造了对象,使用 RMI 我从客户端类访问服务器类上的对象方法。当客户端类访问对象的方法并修改对象的属性时,我需要在服务器类的控制台输出上打印一个通知字符串。
【解决方案2】:

如果此对象不是您的,并且您正在为对象的属性寻找各种事件侦听器,那么不,没有对象属性侦听器。

但是,如果您可以修改对象的来源,我假设您正在使用 getter 和 setter。所以,你会有类似...

public void setIntegerValue(int num){
    this.num = num;
}

最有效的做法是在 setter 中添加某种逻辑,以在整数 num 更改时执行您的函数:

public void setIntegerValue(int num){
    this.num = num;
    yourFunction(); // Let your program know that num has been modified
}

【讨论】:

  • 这里的问题是你必须为班级中的每个二传手做这件事。如果后来的程序员添加了一个新的设置器并且不知道这一点,事情就会中断。有没有办法只检测任何变化?
【解决方案3】:

如果您使用 setter 方法,您可以添加对其他方法的调用。

首先,将您的财产设为私有。

private int myProp;

然后,添加一个 setter。

public void setMyProp(int myProp) {
    boolean isVariableChanged = myProp != this.myProp;
    this.myProp = myProp;
    // do other things
}

在这种情况下,如果变量发生变化,则方法中的布尔值将为真,如果您想防止在变量变回其当前值时触发方法,则可以使用它。

你还需要一个吸气剂。

public int getMyProp() {
    return myProp;
}

一般来说,当类的实现发生变化时,建议使用 getter 和 setter 以使代码更易于维护。

但是,它们还使您能够将 getter 和 setter 用作伪侦听器。

【讨论】:

  • 我要做的是在服务器上的对象上调用一个方法,因此使用 RMI 我可以在客户端控制台上看到方法调用的效果,但我还需要在服务器控制台上显示一些东西
  • 你可以访问服务器上的代码吗?那个变量是怎么设置的?
  • 是的,我访问了服务器的代码,因为这是我为了解某些事情所做的一项微不足道的实验。我正在监听的变量设置为私有
  • 好的,那么在某些时候你必须调用一个setter方法来设置服务器端的变量值。调用该方法时,您可以从您的 setter 调用其他方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多