Java 当某些变量发生变化时,如何激活函数?
我需要在变量更改时激活一个函数,以便它进行更新。i、 e:Java 当某些变量发生变化时,如何激活函数?,java,Java,我需要在变量更改时激活一个函数,以便它进行更新。i、 e: public class Main{ private int a = 1; private boolean ch = false; private void update(){ if(a % 2 == 0){ch = true;} } public static void main(String[] args){ a = 2; } } 不幸的是,没有直接的方法可以做到这一点。但可接受的解决方案是使用setter
public class Main{
private int a = 1;
private boolean ch = false;
private void update(){
if(a % 2 == 0){ch = true;}
}
public static void main(String[] args){
a = 2;
}
}
不幸的是,没有直接的方法可以做到这一点。但可接受的解决方案是使用setter:
private int a = 1;
public void setA(int a) {
this.a = a;
update();
}
public static void main(String[] args) {
Main m = new Main();
m.setA(2);
}
除了在设置变量后自己调用update之外,您还可以将其封装在函数调用中,并确保所有a=usage都使用setA 否则,就没有重新分配变量的通知系统
private static void setA(int a) {
Main.a = a;
update();
}
public static void main(String[] args){
setA(2);
}
除了这个简单的示例之外,您正在寻找的是“观察者设计模式”最灵活的方法是使用PropertyChangeSupport并编写如下内容:
import java.beans.PropertyChangeSupport;
public class MyClass {
private PropertyChangeSupport pptChangeSupport;
private int field1;
private int field2;
private int field3;
public int getField1() {
return field1;
}
public void setField1(int field1) {
int oldValue = this.field1;
this.field1 = field1;
fireChange("field1", oldValue, field1);
}
public int getField2() {
return field2;
}
public void setField2(int field2) {
int oldValue = this.field2;
this.field2 = field2;
fireChange("field2", oldValue, field2);
}
public int getField3() {
return field3;
}
public void setField3(int field3) {
int oldValue = this.field3;
this.field3 = field3;
fireChange("field3", oldValue, field3);
}
public MyClass() {
// TODO Auto-generated constructor stub
}
private void fireChange(String pptName, int oldValue, int newValue) {
if (pptChangeSupport != null) {
getPropertyChangeSupport().firePropertyChange(pptName, oldValue, newValue);
}
}
private PropertyChangeSupport getPropertyChangeSupport() {
return pptChangeSupport == null ? pptChangeSupport = new PropertyChangeSupport(this) : pptChangeSupport;
}
public static void main(String[] args) {
MyClass object = new MyClass();
PropertyChangeSupport pptchangesupport = object.getPropertyChangeSupport();
pptchangesupport.addPropertyChangeListener(e -> System.out
.println("property " + e.getPropertyName() + " changed : " + e.getOldValue() + " -> " + e.getNewValue()));
object.setField1((int) (Math.random()*Integer.MAX_VALUE));
object.setField3((int) (Math.random()*Integer.MAX_VALUE));
object.setField2((int) (Math.random()*Integer.MAX_VALUE));
object.setField1((int) (Math.random()*Integer.MAX_VALUE));
object.setField2((int) (Math.random()*Integer.MAX_VALUE));
object.setField3((int) (Math.random()*Integer.MAX_VALUE));
object.setField2((int) (Math.random()*Integer.MAX_VALUE));
}
}
不幸的是,这并不是强制性编程的方式,也许可观察性是你开始寻找的,我认为你的方法使用反射和其他很酷的把戏。。。但最后-您的代码与@Haytam answer相同,但是对于大量的样板文件,功能上是一样的,唯一的区别是任何人都可以监听这个类,你可以很容易地将其他字段添加到你的类中,并用一种自定义的方式处理它。你可以只通过我的一种方式监听这个字段:java代理和jvm插装。这是一种非常复杂的方式,很难减慢速度你的执行力,反思不能给你这个;反射是一种分析或修改类而不是对象的方法…不知道谁和为什么被否决的可能会被寻找反射?!。但我认为你的答案最有用、最完整。那么,现在你有零了