为什么firePropertyChange(String propertyName,Object oldValue,Object newValue)受保护而不是public? [英] Why is firePropertyChange(String propertyName, Object oldValue, Object newValue) protected and not public?

查看:210
本文介绍了为什么firePropertyChange(String propertyName,Object oldValue,Object newValue)受保护而不是public?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

那么事情就是我正在从 IDateEditor 接口实现工作。 rel =nofollow noreferrer> JCalendar 库,我注意到 Component.firePropertyChange(String propertyName,Object oldValue,Object newValue)方法是不公开但受到保护。情况如下所示:

Well the thing is I'm working on a IDateEditor interface implementation from JCalendar library and I've noticed that Component.firePropertyChange(String propertyName, Object oldValue, Object newValue) method is not public but protected. The situation is illustrated below:

public class DateFormattedTextField implements IDateEditor {

    private JFormattedTextField editor;        
    private DateUtil dateUtil;

    ...

    @Override
    public void setDate(Date date) {
        Date oldDate = (Date)editor.getValue();            
        if(dateUtil.checkDate(date)){
            editor.setValue(date);
            editor.firePropertyChange("date", oldDate, date); // <-- error here
        }
    }

}

正如您所看到的,由于此方法受到保护,我无法触发属性更改。当然,如果我让我的课程从 JFormattedTextfield 而不是使用一个简单的变量,我可以很容易地摆脱这个问题。

As you can see I'm not able to fire a property change because of this method being protected. Of course if I make my class extending from JFormattedTextfield instead of using a simple variable I could easily get rid of this problem.

public class DateFormattedTextField extends JFormattedTextField implements IDateEditor {

    private DateUtil dateUtil;

    ...

    @Override
    public void setDate(Date date) {
        Date oldDate = (Date)getValue();            
        if(dateUtil.checkDate(date)){
            setValue(date);
            firePropertyChange("date", oldDate, date); // <-- No problem here
        }
    }
}

但这不是我在问的。我想知道:为什么这种方法受到保护?

But that's not what I'm asking. I would like to know: why is this method protected?

我知道这应该是一些设计问题,但是我不知道为什么是,特别是考虑到大多数开发财产变更事件的方法都是公开的:

I know it should be some design matter but I can't figure out why is that, especially considering that most of methods to fire property change events are public:

也许最有经验的开发人员可以说明这一点。感谢提前。

Maybe most experienced developers can shed some light on this. Thanks in advance.

这是我的代码到目前为止。随意使用/修改/播放。

Here is my code so far. Feel free to use/modify/play-with it.

public class DateFormattedTextField implements IDateEditor {

    private JFormattedTextField editor;        
    private DateUtil dateUtil;
    private DateFormat dateFormat;
    private String dateFormatString;

    public DateFormattedTextField(){
        dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
        editor = new JFormattedTextField(dateFormat);
        editor.setColumns(10);
        editor.setFocusLostBehavior(JFormattedTextField.COMMIT_OR_REVERT);
        dateUtil = new DateUtil();            
    }

    @Override
    public Date getDate() {
        return (Date)editor.getValue();
    }

    @Override
    public void setDate(Date date) {
        Date oldDate = (Date)editor.getValue();            
        if(dateUtil.checkDate(date)){
            editor.setValue(date);
            editor.firePropertyChange("date", oldDate, date); // <-- error here
        }
    }

    @Override
    public void setDateFormatString(String dateFormatString) {
        this.dateFormatString = dateFormatString;
    }

    @Override
    public String getDateFormatString() {
        return this.dateFormatString;
    }

    @Override
    public void setSelectableDateRange(Date min, Date max) {
        dateUtil.setSelectableDateRange(min, max);
    }

    @Override
    public Date getMaxSelectableDate() {
        return dateUtil.getMaxSelectableDate();
    }

    @Override
    public Date getMinSelectableDate() {
        return dateUtil.getMinSelectableDate();
    }

    @Override
    public void setMaxSelectableDate(Date max) {
        dateUtil.setMaxSelectableDate(max);
    }

    @Override
    public void setMinSelectableDate(Date min) {
        dateUtil.setMinSelectableDate(min);
    }

    @Override
    public JComponent getUiComponent() {
        return editor;
    }

    @Override
    public void setLocale(Locale locale) {
        editor.setLocale(locale); // to be reviewed
    }

    @Override
    public void setEnabled(boolean enabled) {
        editor.setEnabled(enabled);
    }

    @Override
    public void addPropertyChangeListener(PropertyChangeListener listener) {
        editor.addPropertyChangeListener(listener);
    }

    @Override
    public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
        editor.addPropertyChangeListener(propertyName, listener);
    }

    @Override
    public void removePropertyChangeListener(PropertyChangeListener listener) {
        editor.removePropertyChangeListener(listener);
    }

    @Override
    public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
        editor.removePropertyChangeListener(propertyName, listener);
    }
}


推荐答案

更改通知是任何可观察(特别是一般的java bean)的内在责任:如果PropertyChangeEvent在其任何绑定属性被更改时不会触发它,它将违反其合同。在这种情况下,没有其他方面不需要使用fireXX方法。

Change notification is the inherent responsibility of any observable (in general and a java bean in particular): it would violate its contract if it wouldn't fire a PropertyChangeEvent when any of its bound properties is changed. That being the case, no other party ever needs to use the fireXX methods.

所以只是没有任何意义,比范围更广泛的保护。如果你觉得需要它,你做错了。

So it simply doesn't make any sense to have a scope wider than protected. If you feel like needing it, you are doing something wrong.

这篇关于为什么firePropertyChange(String propertyName,Object oldValue,Object newValue)受保护而不是public?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆