gpt4 book ai didi

Java:为什么我们使用属性更改监听器而不是直接指向单个值?

转载 作者:行者123 更新时间:2023-12-02 03:38:44 25 4
gpt4 key购买 nike

监听器的想法是,当对象的某些字段(或属性)发生变化时,所有“注册”监听器将被“通知”并将新值复制到其字段中。但这岂不是一种不必要的复杂冗余设计吗?这是一个简单的建议,可以通过直接值指向和装箱(如果需要)来解决问题。例如,对于字符串字段:

public class StringBox {

protected String value;

public String getValue() {
return value;
}

public void setValueAtomic(String value) {
this.value = value;
}

public StringBox(String value) {
this.value = value;
}

public StringBox() {

}

@Override
public String toString() {
return "StringBox{" + "value=" + value + '}';
}

}
public class StringListenerReplacer {

protected StringBox field;


public StringListenerReplacer(StringBox field) {
this.field = field;
}

public void setField(String field){
this.field.setValueAtomic(field);
}

public String getField(){
return this.field.getValue();
}
}

public class DemoMain {

public static void main(String[] args) {

StringBox field = new StringBox("DemoMain");

StringListenerReplacer s0 = new StringListenerReplacer(field);
StringListenerReplacer s1 = new StringListenerReplacer(field);
StringListenerReplacer s2 = new StringListenerReplacer(field);
StringListenerReplacer s3 = new StringListenerReplacer(field);
StringListenerReplacer s4 = new StringListenerReplacer(field);
StringListenerReplacer s5 = new StringListenerReplacer(field);

System.out.println("Now, it is quasi a listener set to the string field value, so if one object change it, it changes for all");

System.out.println("s0.getField() = " + s0.getField());

System.out.println("Now, for example s4 changes field");

s4.setField("another value");

System.out.println("s0.getField() = " + s0.getField());
System.out.println("s1.getField() = " + s1.getField());
System.out.println("s2.getField() = " + s2.getField());
System.out.println("s3.getField() = " + s3.getField());
System.out.println("s4.getField() = " + s4.getField());
System.out.println("s5.getField() = " + s5.getField());

}

}

对于监听器设计,不谈论它在语法上看起来会很奇怪, 此对象中的每个对象都会引用另一个对象(6*5 = 30 个引用),字符串字段的6 个副本,并且每次更改或字段,将在所有监听器的循环中调用 5 次调用 的 firePropertyChange。现在我明白了,为什么 Eclipse 或 Netbeans IDE 在性能较弱的笔记本电脑上使用 akku 运行时速度极其缓慢。所以问题是,为什么人们在编程中总体使用监听器?

最佳答案

The idea of listener is, that of some field(or attribute) of an object changes, all "registered" listeners will be "notified" and copy the new value to their fields.

我认为这个前提是错误的。我喜欢使用监听器,即一般的观察者模式,但从未以这种方式使用过它们。

您可能希望在单击按钮时执行操作。例如,将一些文本打印到控制台。与使用每个监听器不断轮询按钮以了解更改不同,如果按钮调用监听器,则效率会更高。

即使您引用了变量 isClicked(在单击按钮的帧期间该变量为 true),您仍需要不断检查 if(isClicked ) {...},与每个听众。

关于Java:为什么我们使用属性更改监听器而不是直接指向单个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37123064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com