【发布时间】:2016-05-09 18:37:29
【问题描述】:
监听器的想法是,对象的某些字段(或属性)发生变化,所有“注册”的监听器都会被“通知”并将新值复制到它们的字段中。 然而,这难道不是一种不必要的复杂和冗余的设计吗? 这是一个简单的建议,可以根据需要通过直接值指向和收件箱来解决问题。 例如,如果是字符串字段:
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 工作。 所以问题是,为什么人们在编程中总体使用监听器?
【问题讨论】:
标签: java eclipse netbeans listener