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

Java 我应该创建静态方法还是抽象超类,java,abstract-class,static-methods,Java,Abstract Class,Static Methods,我试图重构一个项目,其中有相同的方法分布在不同的类中。为了减少代码重复,我应该将公共代码移到抽象超类中,还是将其放在实用程序类中的静态方法中 编辑 有些方法是针对一般性的东西,我相信它们可以是静态的。虽然还有一些引用类的属性,但在这种情况下,我认为将其作为抽象的超类更为合理 如果它不使用任何类成员,您可以静态执行 但你应该在抽象类或母类 < P>中进行。另一个要考虑的点可能是这些函数所做的工作类型。如果这是分散的,您应该使用静态方法创建facade/helper/util类。这取决于您的代码在做

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

编辑
有些方法是针对一般性的东西,我相信它们可以是静态的。虽然还有一些引用类的属性,但在这种情况下,我认为将其作为抽象的超类更为合理

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


但你应该在抽象类或母类

< P>中进行。另一个要考虑的点可能是这些函数所做的工作类型。如果这是分散的,您应该使用静态方法创建facade/helper/util类。

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


请记住,如果将它们设置为静态,并且应用程序是多线程的,则必须使用锁来保护它们。这反过来又降低了并发性。在这种情况下,取决于有多少线程调用同一段代码,您可能会考虑将它(代码)移动到超级类。 好吧,我遵循一条规则:不要使用基类来删除代码重复,使用实用类。

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

另一条大多数情况下都是正确的规则是:更喜欢组合而不是继承

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


将这些规则应用到您的secenrios中,并在考虑维护性和可伸缩性的情况下做出决定。但是,如果您可以为您的问题添加更多细节,这将是一件好事。

如果这些方法使用了该类的许多字段或方法,那么它们不应该是静态的。 如果它们是子类可能要修改的内容,则它们不应是静态的。 如果这些方法应该是接口的一部分,那么它们就不能是静态的


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

正如其他人提到的,这个问题的答案取决于问题的上下文和重复的代码

一些需要考虑的事情

  • 复制的代码是否会改变对象的实例。在本例中,是公共抽象类中受保护的方法
  • <> LIE代替静态效用类考虑单体,静态方法对于纯单元测试可能有问题,尽管测试框架在这方面变得更好。
  • 继承可能很棘手,想想这些来自不同类的对象是否真的相关,是否需要一些OO重新分解?或者它们是不相交的域逻辑片段,恰好需要相似的代码位
乍一看,我认为最好将公共代码作为公共类中的公共静态方法。这将使该方法仅通过使用

    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类的静态方法。

没有上下文,无法回答;很大程度上取决于现有类的密切关系、类和方法的使用方式等。您必须告诉我们更多关于这些方法的信息-如果它们具有相同的行为,并且可以独立于任何类进行操作,那么将实用程序类与静态方法结合起来是有意义的。如果您想使用抽象类/基类/接口,则必须考虑该类层次结构是否有意义,以及这些函数是否是这些类固有的行为,或者如前所述,这些方法不关心它们所属的类。您能解释一下该方法的作用以及所有这些类是否都相关吗?请提供更多与您实际尝试执行的操作相关的信息。我问了几乎相同的问题:。看看它是否有用。这里的时间还早:X不要期望太多:DYou只需要锁定静态方法,如果它们是stateful@user949300我同意。我在做假设。更多的细节会减少猜测,但我喜欢你提到的经验法则。