【问题标题】:Is it bad practice to reference a static method from a child class?从子类中引用静态方法是不好的做法吗?
【发布时间】:2014-05-26 01:05:22
【问题描述】:

我收到来自 IDE 的警告说,

JFrame 类型的静态方法 setDefaultLookAndFeelDecorated(boolean) 应该以静态方式访问

我想知道哪个更正确:
从声明类(JFrame.setDefaultLookAndFeelDecorated(true);)中引用,

还是继承类 (MyJFrame.setDefaultLookAndFeelDecorated(true);)?

【问题讨论】:

    标签: java eclipse oop inheritance


    【解决方案1】:

    我会在声明它的类上调用该方法。

    在子类化上调用它也可以,但由于静态方法不能真正被继承/覆盖,这似乎有点令人困惑。

    出于同样的原因,我也会避免使用与您的父类之一具有相同名称/签名的静态方法。

    这些建议绝对不是“更面向对象”,但这是我的观点:由于正常的 OO 思维不能很好地转化为静态方法,因此完全避开。

    【讨论】:

      【解决方案2】:

      在我看来,JFrame.setDefaultLookAndFeelDecorated 将是一种首选方式,因为如果您使用 DynamicWindow.setDefaultLookAndFeelDecorated,那么该方法的来源就变得不那么明显了。我认为您在子类中创建了相同的方法来隐藏超类中的原始方法。

      因此,对于那些会阅读您的代码的人来说,它并不那么明显。

      【讨论】:

        【解决方案3】:

        在这种情况下,JFrame.setDefaultLookAndFeelDecorated(true); 将是调用所述静态方法的适当方式。

        要详细说明 Thilo 回答中的第三句话,您不能覆盖静态方法。就是做不到。

        如果您创建一个与现有静态方法具有相同签名的新静态方法,那么您只是在隐藏原始方法,任何使用您的代码的人都会感到困惑。

        请记住,在静态方法的情况下,调用哪个方法取决于引用类型。对于实例方法,它取决于实例类型

        静态方法是一种代码味道。仅在必须的地方使用其他静态方法,不要创建自己的方法。

        【讨论】:

        • “不要创建你自己的。”。这有点极端。您可以将实际上不需要属于任何对象的实用程序代码放入充满静态方法的类中(然后您可以静态导入)。 Commons Lang StringUtils 之类的东西。只是不要将它与 OOP 混合太多。也许我们可以同意静态方法应该限制在只有静态方法的最终类(JFrame 将违反此规则)。
        • 我认为静态方法会阻碍可测试性并引入紧密耦合,从而导致各种不好的事情。有些人会认为实用程序类是可憎的。重用“标准”实用程序类,例如您提到的那个,Commons Lang StringUtils 是我要划清界限的地方。不实现自己的静态方法/实用程序类应该始终是目标。我想如果您必须在实用程序类中实现静态方法,那么像您建议的那样限制“子类化”将是防止进一步坏事发生的好方法。当然,以我的拙见。
        猜你喜欢
        • 2011-07-07
        • 2011-09-22
        • 2011-02-14
        • 2010-12-28
        • 1970-01-01
        • 2011-08-13
        • 2021-05-07
        • 2011-03-10
        相关资源
        最近更新 更多