2011-12-16 61 views
7

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

编辑 一些方法是用于通用的东西,我相信可以做成静态的。虽然还有其他的指称类的属性,在这种情况下,我认为将它作为一个抽象的超类是更有意义的。

+2

无法回答没有上下文;很大程度上取决于现有类的密切相关程度,类和方法的使用方式等。 – 2011-12-16 05:26:20

+1

您必须告诉我们更多关于这些方法的信息 - 如果它们共享相同的行为并且可以独立于任何类别执行操作,静态方法的类将是有意义的。如果您正在考虑使用抽象类/基类/接口,则必须考虑该类层次结构是否合理,以及这些函数是否真的是这些类的固有行为,或者如前所述,这些方法不关心关于他们所属的课程。 – birryree 2011-12-16 05:27:00

+0

你能解释一下这个方法是干什么的吗?如果所有这些类都是相关的? – 2011-12-16 05:27:34

回答

0

如果它不使用任何班级成员,你可以做它静态!

但是,你应该做一个抽象类或母亲类

1

还有一点要考虑的可能是这些功能做的工作类型。如果这是分散的,你应该用静态方法创建一个facade/helper/util类。

2

这取决于你的代码在做什么。他们是实用方法吗?他们是具体/专门的类方法吗?这是一个沉重的多线程应用程序?

请记住,如果你让他们静和你的多线程应用程序,你必须保护他们W¯¯锁。这又降低了并发性。在这种情况下,根据多少个线程调用同一段代码,你可能会考虑将它移动到一个超类。

5

嗯,我遵循一个规则:不要使用基类来删除重复代码,使用的工具类。

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

另一条规则,其中大部分时间是正确的,方法是:不想在成分使用静态实用类继承

是不正确的成分,但它可以被称为它的推导。

应用这些规则,你secenrios并作出决定牢记维护及可扩展性。不过,如果您可以在您的问题中添加更多详细信息,那就太好了。

0

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

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

1

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

有些事情要考虑

  • 是否复制代码变异对象的实例。在这种情况下,在一个共同的抽象类
  • 而不是静态实用工具类保护的方法考虑单,静态方法可以尽管测试框架都做的更好是纯粹的单元测试问题。
  • 继承可能会很棘手,想想如果这些来自不同类的对象真的相关并且需要一些面向对象的重构?或者它们是发生在需要相似位代码的领域逻辑的不相交部分。
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类的静态方法。

相关问题