0

我正在创建一个扩展类PropertyChangeSupport。我目前想要做的是覆盖firePropertyChange()

firePropertyChange,因为它在 PropertyChangeSupport 中实现:

public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
    if (oldValue == null || newValue == null || !oldValue.equals(newValue)) {
        firePropertyChange(new PropertyChangeEvent(this.source, propertyName, oldValue, newValue));
    }
}

我打算覆盖firePropertyChange

public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
    if (oldValue == null || newValue == null || !oldValue.equals(newValue)) {
        firePropertyChange(new JoystickPropertyChangeEvent(this.source, propertyName, oldValue, newValue)); //compile error: source is not visible
    }
}

JoystickPropertyChangeEvent是我创建并扩展的类ProperyChangeEvent

问题是我的预期实现无法编译,因为 source 是私有的并且没有gettersin PropertyChangeSupport,因此子类无法访问它。我无法修改PropertyChangeSupport的代码。

有没有比将源的私有副本作为我的子类的字段更优雅的方法来解决这个问题?

相关问题: 如何访问其子类中的类的私有变量?

4

5 回答 5

2

由于您扩展您在构造函数PropertyChangeSupport中调用正确吗?super()的原始构造函数PropertyChangeSupportsource(即一个bean)作为参数。

public PropertyChangeSupport(Object sourceBean).

sourceBean论据是source你想要的。使用您自己的私人成员来保存该引用。然后你可以在firePropertyChange()方法中使用它。

public static class MyPropertyChangeSupport extends PropertyChangeSupport {
    private Object mySource;

    public MyPropertyChangeSupport(Object sourceBean) {
        super(sourceBean);
        // store the bean reference in your field
        this.mySource = sourceBean;
    }

    @Override
    public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
        if (oldValue == null || newValue == null || !oldValue.equals(newValue)) {
            // use mySource here
            firePropertyChange(new JoystickPropertyChangeEvent(mySource, propertyName, oldValue, newValue)); 
        }
    }
}
于 2013-07-25T12:37:25.197 回答
1

我会质疑这个设计。

出于某种原因,您尝试覆盖的方法已设为私有,即使您可以更改其实现我也不建议这样做,因为您不知道这会对其他地方产生什么影响。

于 2013-07-25T11:57:08.913 回答
1

如果你真的很笨,你可能会尝试通过反射来解决这个问题。但这太复杂了,我什至不会再提它了。

您的目标似乎是让属性更改侦听器能够将某些事件与其他事件区分开来。如果听众可以在没有帮助的情况下将它们区分开来,那就这样做。如果这不方便,请提供一个静态方法来分析属性更改事件并返回它是否应该是JoystickPropertyChangeEvent.

另外,为什么要使用属性更改事件?如果您想在操纵杆状态更新时触发事件,您应该为此触发您自己的自定义事件。

于 2013-07-25T12:00:08.970 回答
0

为此,您可以使用反射。

如果 ParentClass 私有变量就像

private String private_source_parent = "some_value";

在您的 ChildClass 中扩展父类

ParentClass obj = new ParentClasS();
Field f = obj.getClass().getDeclaredField("private_source_parent"); //NoSuchFieldException
f.setAccessible(true);
String source_inchild = (String) f.get(obj);

在您的 ChildClass 中,您将获得父私有成员的值。

于 2013-07-25T12:14:57.983 回答
-1

您可以使用超类的 getter 方法来获取源属性,即

super.firePropertyChange(new JoyStickPropertyChangeEvent(super.getSource, propertyName, oldValue, newValue); 

这应该可以解决问题。作为解释,您必须显式调用超类的 firePropertyChange 方法。这是通过关键字 super 完成的。

希望这可以帮助

干杯

于 2013-07-25T11:59:39.347 回答