这个有趣问题的几个方面(Mad 已经提到了备用开发人员)
我们仅重写 getXXSize()(也相对于 setXXSize())是否违反了 LSP?
如果我们做得正确的话就不会:-) 第一个权威是属性的 API 文档,最好从它的起源开始,即组件:
将此组件的首选大小设置为常量值。对 getPreferredSize 的后续调用将始终返回该值。
这是一个具有约束力的合同,因此无论我们如何实现吸气剂,它都必须尊重constant如果设置的话值:
@Override
public Dimension getPreferredSize() {
// comply to contract if set
if(isPreferredSizeSet())
return super.getPreferredSize();
// do whatever we want
return new Dimension(dim);
}
XXSize 是一个绑定属性 - 是吗?
在 JComponent 的祖先中,只有间接证据:实际上,Component 在 setter 中触发 PropertyChangeEvent。 JComponent 本身似乎记录了这一事实(我加粗):
@beaninfo
首选:真实绑定:真实描述:组件的首选尺寸。
这是……完全错误的:作为绑定属性意味着每当值发生变化时都需要通知侦听器,即以下(伪测试)必须通过:
JLabel label = new JLabel("small");
Dimension d = label.getPreferredSize();
PropertyChangeListener l = new PropertyChangeListener() ...
boolean called;
propertyChanged(...)
called = true;
label.addPropertyChangeListener("preferredSize", l);
label.setText("just some longer text");
if (!d.equals(label.getPreferredSize())
assertTrue("listener must have been notified", l.called);
...但是失败了。出于某种原因(不知道为什么这可能被认为是合适的),他们想要constantxxSize 的一部分是绑定属性 - 这种覆盖根本不可能。可能(当然是疯狂猜测)一个历史性问题:最初,二传手仅在 Swing 中可用(有充分的理由)。在向后移植到 awt 时,它突变为一种从未存在过的 bean 属性。