静态方法是否应该与实例方法 类 分开?
Should static methods be separated from Classes with instance methods?
作为一般约定,是否应该将静态方法从具有实例方法的 class 中分离到另一个 class 中?
你的理由也有例子吗?
这可能是一个重复的问题,但是不,静态方法具有非常具体的好处,这些好处在实例化为对象的 类 中通常很有价值。
没有这样的约定。这完全取决于你的情况。一些 class 可能确实需要静态和非静态成员的混合。
但有时会在某些 java 项目中看到 Constatns.java/ Utils.java
class 的使用。您可能会发现 -
public static final double PI = 3.1416;
public static getArea(double r){}
此 class 包含一些最终静态 属性 和一些最终方法。这些 class 的目的是在整个项目中提供一些常量或实用方法。
肯定的答案将由用例决定,但没有这样的约定。最多你有一些 Utility
class 可能有一堆静态方法被其他 classes 用作辅助方法。例如,测试一个字符串是否为电子邮件或从电子邮件中提取用户名等。
没有一般约定规定静态方法必须与非静态方法分开。事实上,如果这两种方法彼此足够相关,那么将这些方法分开是违反直觉的。
回想一下静态方法(和字段)有哪些用例:它们 methods/fields 可以在没有特定 class 实例的情况下使用。这通常意味着它们持有有价值的元数据或执行与其 class 实例相关的有用操作,但不需要直接实例化 class.
例如,Integer
。它具有静态 [final
] 字段 MAX_VALUE
和 MIN_VALUE
。由于这两个字段都包含在实例化之间不会更改的固定信息,因此必须实例化一个 Integer
来获取此信息是没有意义的。
Integer
也有有用的操作 parseInt
,它将 String
转换为 int
。我们不应该要求 Integer
的实例从 String
转换为 int
, 特别是 如果我们不将它放入的实例Integer
.
总体约定是将相关方法放在一起,无论它们是否是静态的。您可以在某些 Java 库 classes 中看到更清晰的示例,例如 Integer
.
在编写 API 或框架时,将所有静态方法放在单独的 class 中会很有用。 Collections class 就是一个例子。 java.lang.Math 或 java.lang.System 是另一个。
通常在以下场景定义静态方法:
- 在编写实用程序时 classes。
- 如果该方法不使用任何实例变量。
- 如果任何操作独立于实例创建。
- 如果您确定永远不会更改或覆盖方法的定义。由于无法覆盖静态方法。
看这里 -
作为一般约定,是否应该将静态方法从具有实例方法的 class 中分离到另一个 class 中?
你的理由也有例子吗?
这可能是一个重复的问题,但是不,静态方法具有非常具体的好处,这些好处在实例化为对象的 类 中通常很有价值。
没有这样的约定。这完全取决于你的情况。一些 class 可能确实需要静态和非静态成员的混合。
但有时会在某些 java 项目中看到 Constatns.java/ Utils.java
class 的使用。您可能会发现 -
public static final double PI = 3.1416;
public static getArea(double r){}
此 class 包含一些最终静态 属性 和一些最终方法。这些 class 的目的是在整个项目中提供一些常量或实用方法。
肯定的答案将由用例决定,但没有这样的约定。最多你有一些 Utility
class 可能有一堆静态方法被其他 classes 用作辅助方法。例如,测试一个字符串是否为电子邮件或从电子邮件中提取用户名等。
没有一般约定规定静态方法必须与非静态方法分开。事实上,如果这两种方法彼此足够相关,那么将这些方法分开是违反直觉的。
回想一下静态方法(和字段)有哪些用例:它们 methods/fields 可以在没有特定 class 实例的情况下使用。这通常意味着它们持有有价值的元数据或执行与其 class 实例相关的有用操作,但不需要直接实例化 class.
例如,Integer
。它具有静态 [final
] 字段 MAX_VALUE
和 MIN_VALUE
。由于这两个字段都包含在实例化之间不会更改的固定信息,因此必须实例化一个 Integer
来获取此信息是没有意义的。
Integer
也有有用的操作 parseInt
,它将 String
转换为 int
。我们不应该要求 Integer
的实例从 String
转换为 int
, 特别是 如果我们不将它放入的实例Integer
.
总体约定是将相关方法放在一起,无论它们是否是静态的。您可以在某些 Java 库 classes 中看到更清晰的示例,例如 Integer
.
在编写 API 或框架时,将所有静态方法放在单独的 class 中会很有用。 Collections class 就是一个例子。 java.lang.Math 或 java.lang.System 是另一个。
通常在以下场景定义静态方法:
- 在编写实用程序时 classes。
- 如果该方法不使用任何实例变量。
- 如果任何操作独立于实例创建。
- 如果您确定永远不会更改或覆盖方法的定义。由于无法覆盖静态方法。
看这里 -