应该使用实例方法将静态方法与类分开吗?

时间:2015-04-25 18:44:50

标签: java oop static design-principles

作为一般惯例,静态方法是否应该从具有实例方法的类中分离为另一个类?

还有一个你的理由的例子吗?

5 个答案:

答案 0 :(得分:5)

没有一般约定规定静态方法必须与非静态方法分开。事实上,如果这两种方法彼此足够相关,那么将这些方法分开是违反直觉的。

回想一下静态方法(和字段)的用例:它们是可以在没有特定类的实例的情况下使用的方法/字段。这通常意味着它们拥有有价值的元数据或执行与其类实例相关的有用操作,但不需要直接实例化该类。

Integer为例。它具有静态[final]字段MAX_VALUEMIN_VALUE。由于这两个字段都包含在实例化之间不会更改的固定信息,因此必须实例化Integer才能获取此信息。

Integer也有一个有用的操作parseInt,它需要String并将其转换为int。我们不应要求Integer的实例从String转换为int尤其是,如果我们不将它放入{{1}的实例中}}

总体惯例是将相关方法保持在一起,无论它们是否是静态的。您可以在某些Java库类中看到更清晰的示例,例如Integer

答案 1 :(得分:2)

这可能是一个重复的问题,但不是,静态方法具有非常具体的好处,这些好处在实例化为对象的类中通常很有价值。

答案 2 :(得分:2)

没有这样的惯例。这完全取决于你的情况。某些类可能确实需要静态和非静态成员的混合。

但有时可以看到在某个java项目中使用Constatns.java/ Utils.java类。你可能找到了 -

public static final double PI = 3.1416;
public static getArea(double r){}

该类包含一些最终的静态属性和一些最终方法。这些类的目的是在整个项目中提供一些常量或实用方法。

答案 3 :(得分:2)

肯定答案将由用例决定,但没有这样的约定。最多你有一些Utility类可能有一堆静态方法,其他类使用它们作为辅助方法。例如,测试String是电子邮件还是从电子邮件中提取用户名等。

答案 4 :(得分:1)

在编写API或框架时,将所有静态方法放在单独的类中会很有用。 Collections类就是一个例子。 java.lang.Math或java.lang.System是另一个。

通常,在以下场景中定义静态方法:

  • 编写实用程序类时。
  • 如果方法不使用任何实例变量。
  • 如果任何操作与实例创建无关。
  • 如果您确定永远不会更改或覆盖方法的定义。由于无法覆盖静态方法。

见这里 - https://stackoverflow.com/a/5313383/760393