我应该创建静态方法还是抽象超类

时间:2011-12-16 05:23:24

标签: java abstract-class static-methods

我正在尝试重构一个项目,其中有相同的方法分布在不同的类中。为了减少代码重复,我应该将公共代码移动到抽象超类还是应该将它放在实用程序类中的静态方法中?

修改 一些方法是针对通用的东西,我认为可以做成静态的。虽然还有其他人引用了类的属性,但在这种情况下,我认为将它作为抽象超类更有意义。

7 个答案:

答案 0 :(得分:6)

好吧,我遵循一条规则:不要使用基类删除代码重复,使用实用程序类。

对于继承,请向自己提问:是否存在Is-A关系?

大多数时候都是正确的另一条规则是:首选合成而不是继承

使用静态实用程序类不是真正的组合,但它可以称为它的派生。

将这些规则应用于您的secenrios并做出决策,记住维护和可扩展性。但是,如果您可以向问题添加更多详细信息,那将是一件好事。

答案 1 :(得分:2)

这取决于您的代码在做什么。它们是实用方法吗?它们是特定的/专门的类方法吗?这是一个繁重的多线程应用程序吗?

请记住,如果您将它们设置为静态且应用程序是多线程的,则必须保护它们。反过来,这会降低并发性。在这种情况下,根据调用同一段代码的线程数量,您可以考虑将其(代码)移动到超类。

答案 2 :(得分:1)

要考虑的另一点可能是这些功能所做的工作类型。如果分散,则应使用静态方法创建facade / helper / util类。

答案 3 :(得分:1)

正如其他人所提到的,答案取决于问题的背景和重复的代码。

需要考虑的一些事项

  • 重复的代码是否会改变对象的实例。在这种情况下,公共抽象类中的受保护方法
  • 而不是静态实用程序类考虑单例,静态方法对于纯单元测试可能会有问题,尽管测试框架在这方面越来越好。
  • 继承可能很难做到正确,想想来自不同类的这些对象是否真的相关并需要一些OO重新分解?或者它们是不相交的域逻辑片段,恰好需要类似的代码。

答案 4 :(得分:0)

如果它不使用任何类成员,你可以静态地执行它!

但你应该在抽象课堂或母班上做这件事

答案 5 :(得分:0)

如果方法使用该类的许多字段或方法,则它们不应该是静态的。 如果它们是子类可能想要修改的东西,则它们不应该是静态的。 如果方法应该是接口的一部分,则它们不能是静态的。

否则这是你的电话,你可能会在以后改变主意。 : - )

答案 6 :(得分:0)

乍一看,我会说将公共代码作为公共类中的公共静态方法更好。这将使该方法仅使用

对任何类有用
    UtilityClassName.methodName();

这比将它作为抽象超类中的具体方法更好,因为那样你总是需要在你想要使用这一个方法的所有类中扩展这个超类。

但是现在,正如你所说,方法的行为取决于一些变量。现在,如果它依赖于不同类的实例变量,那么最好在接口中添加此方法,让所有类实现此接口并拥有自己的相同实现。

但是如果这些变量是常量值,那么在接口中有这些常量值。在实用程序类中实现这些接口。再次使它成为该实用程序类中的静态方法,它将直接使用这些常量。

例如考虑一下。回归区域的通用代码。

    public interface TwoDimensional{
        double PI = 3.14;
    }

    public class MyUtility implements TwoDimensional{
        public static double getCircleArea(double radius){
            return PI*radius*radius;
        } 
    }

在这里,您可以看到方法getCircleArea()取决于不同类的半径,但我仍然可以将此值传递给myUtility类的静态方法。