- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我总是在这个网站上看到覆盖 getPreferredSize()
而不是使用 setPreferredSize()
的建议,如这些先前线程中所示。
看这个例子:
public class MyPanel extends JPanel{
private final Dimension dim = new Dimension(500,500);
@Override
public Dimension getPreferredSize(){
return new Dimension(dim);
}
public static void main(String args[]){
JComponent component = new MyPanel();
component.setPreferredSize(new Dimension(400,400));
System.out.println(component.getPreferredSize());
}
}
setPreferredSize()
- Sets the preferred size of this component.
getPreferredSize()
- If the preferredSize has been set to a non-null value just returns it. If the UI delegate's getPreferredSize method returns a non null value then return that; otherwise defer to the component's layout manager.
这样做显然会破坏 Liskov Substitution Principle .
prefferedSize
是一个绑定(bind)属性,因此当您设置它时,将执行 firePropertyChange
。所以我的问题是,当您覆盖 getPrefferedSize()
时,您是否也需要覆盖 setPreferredSize(..)
?
示例:
public class MyPanel extends JPanel{
private Dimension dim = null;
@Override
public Dimension getPreferredSize(){
if(dim == null)
return super.getPreferredSize();
return new Dimension(dim);
}
@Override
public void setPrefferedSize(Dimension dimension){
if(dim == null)
dim = new Dimension(500,500);
super.setPreferredSize(this.dim); //
}
public static void main(String args[]){
JComponent component = new MyPanel();
component.setPreferredSize(new Dimension(400,400));
System.out.println(component.getPreferredSize());
}
}
现在我们看到我们得到了相同的结果,但监听器将收到真实值的通知,而且我们不会破坏 LSP,因为 setPreferredSize
状态 设置此组件的首选大小。
但不是如何。
最佳答案
这个有趣问题的几个方面(Mad 已经提到了 spare-my-fellow-developer)
我们是否在仅覆盖 getXXSize() 时违反了 LSP(相对于 setXXSize() 也是如此)?
如果我们做对了 :-) 第一个权威是属性的 API 文档,最好从它的来源开始,即组件:
Sets the preferred size of this component to a constant value. Subsequent calls to getPreferredSize will always return this value.
这是一个有约束力的契约(Contract),因此无论我们如何实现 getter,它都必须遵守 constant 值(如果已设置):
@Override
public Dimension getPreferredSize() {
// comply to contract if set
if(isPreferredSizeSet())
return super.getPreferredSize();
// do whatever we want
return new Dimension(dim);
}
XXSize 是绑定(bind)属性 - 是吗?
在 JComponent 的祖先中只有间接证据:实际上,Component 在 setter 中触发 PropertyChangeEvent。 JComponent 本身似乎记录了这个事实(由我加粗):
@beaninfo preferred: true bound: true description: The preferred size of the component.
这是……完全错误的:作为绑定(bind)属性意味着只要值发生变化就需要通知监听器,即必须通过以下(伪测试):
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);
...但是失败了。出于某种原因(不知道为什么这可能被认为是合适的)他们希望 xxSize 的 constant 部分成为绑定(bind)属性——这样的覆盖根本不可能。可能(当然是胡乱猜测)一个历史问题:最初,setter 仅在 Swing 中可用(出于充分的理由)。在它向 awt 的反向移植中,它变成了一个从未有过的 bean 属性。
关于java - 覆盖 getPreferredSize() 会破坏 LSP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21052894/
来自 Liskov Substitution Principle - www.blackwasp.co.uk One common indication of non-compliance with
是否可以在 Windows 中使用 LSP(分层服务提供程序)更改传出数据包的目标套接字(IP 和端口)? 例如,我想将所有 HTTP 数据包重定向到代理服务器(给定 IP/端口)。这样我就可以为 W
在 objective-C 中,我可以子类化一个 View Controller ,如下所示。 class KeyboardObserverViewController: UIViewControll
提前为一个冗长的问题道歉。在这里特别感谢反馈。 . . 在我的工作中,我们做了很多关于日期范围的事情(日期周期,如果你愿意的话)。我们需要进行各种测量,比较两个日期周期之间的重叠等。我设计了一个接口(
我的处境与Steve McConnell's 非常相似在Code Complete中有提到。只有我的问题是基于 Vehicles 而 Trike 恰好是根据法律属于 Cars 类别。到目前为止,汽车只
本文实例讲述了PHP面向对象五大原则之里氏替换原则(LSP)。分享给大家供大家参考,具体如下: 替换原则由MIT计算机科学实验室的Liskov女士在1987年的OOPSLA大会上的一篇文章中提出,
当我注意到this answer时,我一直在阅读里氏替换原理。 。它有一个 Circle 和一个 ColoredCircle 类型,其中 ColoredCircle 的构造函数需要一个额外的参数; 颜
我正在寻找代码中的标志,以表明可能违反里氏替换原则。首先,我创建了一个简单的类和另一个继承它的类: public class Adder { public virtual int Add(in
我正在寻找代码中的标志,以表明可能违反里氏替换原则。首先,我创建了一个简单的类和另一个继承它的类: public class Adder { public virtual int Add(in
我有这段代码可以实现两种类型的门。一扇门有锁,另一扇没有。 Door 界面很简单: public interface Door { void open(); void close();
我有一个名为 Message 的基类,如下所示: public abstract class Message { protected int m_id; protected bool
为了使我的代码可测试,我正在尝试遵守 Liskov's substitution principle让我的 SwiftUI View 依赖于协议(protocol)而不是具体类型。这使我可以轻松地交换
我更多是出于好奇而不是真正关心它 ,但我一直想知道 JavaScript 事件系统是否违反了 Liskov substitution principle (LSP)或不。 调用 EventTarget
序言 是我太久没发了吗?昨天没人看,那么今天来点特别的~ 不仅把好看的视频全部pa下来,咱们还要实现自动评论、点赞、关注三连~ 宝,你也可以顺手给我个三连吗?给你个摸摸大~ 抓包分析流程 我写成了文档
我的 Neovim LSP 错误消息没有红色: 这是我的 vimrc 文件。我真的不知道是什么问题。 syntax on set guicursor= set relativenumber set n
LSP与协方差和逆变之间有什么关系?有什么关系吗? LSP 是协方差的一种形式吗? 最佳答案 我不会这么说Liskov's Substitution Principle是协方差的一种“形式”,就像泛型
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 8年前关闭。 Improve this
在emacs中,使用gopls但在我的路径上找不到go。但它在那里,我可以运行它。向社区伸出援手,看看我是否缺少任何东西。我可以毫无问题地运行基本的gin服务器。 使用文档中的config。 输出:
我正在开发 LSP,我需要知道确切的 URL 是什么。 例如,假设用户正在使用 Firefox 浏览页面。我想获取页面的完整 URL,无论是 HTTP 还是 HTTPS。我该怎么做? 我可以通过获取
有谁知道如何调试微软平台SDK提供的LSP示例?我阅读了有关此主题的内容,发现示例 dt_dll 生成了一个 DLL 文件,该文件可与已检查版本的 ws2_32.dll 一起使用。 问题是他们没有说明
我是一名优秀的程序员,十分优秀!