如果常量接口反模式就是这样的犯罪,Swing为什么要这样做



我正在制作一个 swing 应用程序,并意识到我有几个类需要访问同一组常量。我不能让自己宣布一个人是它们的主要持有者,把它们都放在那里,让其他人参考它;我想,嘿,我会让它们都从某个共同的地方继承,但是Java不做多重继承,但我可以在东西上放置无限接口。所以我想到将它们全部转储到一个界面中(这是真的,我只是自然而然地想到了,没有做任何研究)。

后来我才知道这是异端邪说。"事实上,这是一个糟糕的主意,它有一个名字:常量接口反模式" - 正如这里讨论的(以及一个替代解决方案(我选择使用))。

我对此很好,

直到我查看 JDialogJFrame 的源代码,其内容如下:

public class JDialog extends Dialog implements WindowConstants,
                                               Accessible,
                                               RootPaneContainer,
                               TransferHandler.HasGetTransferHandler
{
...

public class JFrame extends Frame implements WindowConstants,
                                             Accessible,
                                             RootPaneContainer,
                             TransferHandler.HasGetTransferHandler
{
...

也许只有我一个人,但我肯定会在那里看到一个恒定的界面。更有趣的是JDialog中的作者声明之一,即James Gosling。语言之父允许这个所谓的错误在他的手表上?

(另一个值得注意的例子 - 摇摆康斯坦斯)

如果常量接口反模式是一个坏主意,那么为什么它在语言最著名的包之一(即 swing)中如此大量使用?

在java 5之前,使用static import的更好解决方案不可用。到目前为止,滥用接口导入常量被认为是可以接受的,因为没有更好的选择。一旦您决定JDialog实现WindowConstants(并在文档中断言了这一点),您将无法在不破坏向后兼容性的情况下撤消它。例:

JDialog d = new JDialog();
int flag = d.DISPOSE_ON_CLOSE;

虽然可能不是很好的风格,但这并不罕见,如果我们将 JDialog 更改为使用静态导入而不是实现 WindowConstants 就会中断。

相关内容

最新更新