【发布时间】:2015-04-25 18:44:50
【问题描述】:
作为一般惯例,静态方法是否应该从具有实例方法的类中分离到另一个类中?
你的理由也有例子吗?
【问题讨论】:
标签: java oop static design-principles
作为一般惯例,静态方法是否应该从具有实例方法的类中分离到另一个类中?
你的理由也有例子吗?
【问题讨论】:
标签: java oop static design-principles
没有规定静态方法必须与非静态方法分开的一般约定。事实上,如果这两种方法之间有足够的相关性,那么将它们分开是违反直觉的。
回想一下静态方法(和字段)的用例:它们是可以在没有特定类的实例的情况下使用的方法/字段。这通常意味着它们拥有有价值的元数据或执行与其类实例相关的有用操作,但不需要直接实例化该类。
以Integer 为例。它具有静态 [final] 字段MAX_VALUE 和MIN_VALUE。由于这两个字段都包含在实例化之间不会改变的固定信息,因此必须实例化 Integer 来获取此信息是没有意义的。
Integer 也有有用的操作parseInt,它将String 转换为int。我们不应该要求Integer 的实例从String 转换为int,尤其是如果我们不将它放入Integer 的实例中。
总体惯例是将相关方法放在一起,无论它们是否是静态的。您可以在某些 Java 库类中看到更清晰的示例,例如 Integer。
【讨论】:
Integer 实例。这个想法是这是一个factory,或者可以持续产生int 值的东西。
int和Integer之间的区别;它们不是一回事。在您提到的场景中,不使用静态方法并创建Integer 的新实例的唯一实际意义是通过对象构造函数。
这可能是一个重复的问题,但不,静态方法具有非常具体的好处,这些好处在实例化为对象的类中通常很有价值。
【讨论】:
没有这样的约定。这完全取决于你的情况。某些类可能确实需要静态和非静态成员的混合。
但有时会看到在某些 java 项目中使用 Constatns.java/ Utils.java 类。你可能会发现 -
public static final double PI = 3.1416;
public static getArea(double r){}
这个类包含一些 final 静态属性和一些 final 方法。这些类的目的是在整个项目中提供一些常量或实用方法。
【讨论】:
肯定的答案将由用例决定,但没有这样的约定。最多你有一些Utility 类,它可能有一堆静态方法,其他类用作辅助方法。例如测试字符串是否为电子邮件或从电子邮件中提取用户名等。
【讨论】:
在编写 API 或框架时,将所有静态方法放在一个单独的类中会很有用。 Collections 类就是一个例子。 java.lang.Math 或 java.lang.System 是另一个。
通常,在以下场景中定义静态方法:
【讨论】: