拥有一个不使用实例变量的非静态方法是否有意义?
2022-09-01 11:22:36
编译器不允许静态方法调用非静态方法。我知道它这样做是因为非静态方法通常最终使用实例变量。
但是,使用不使用实例变量的非静态方法是否有意义。如果我们的行为不影响或不受实例状态的影响,那么这样的方法不应该被标记为静态。
编译器不允许静态方法调用非静态方法。我知道它这样做是因为非静态方法通常最终使用实例变量。
但是,使用不使用实例变量的非静态方法是否有意义。如果我们的行为不影响或不受实例状态的影响,那么这样的方法不应该被标记为静态。
嗯,当然!假设您在 .它有一个 方法 .interface IMyCollection
boolean isMutable()
现在您有两个类 和 ,它们都实现了 。它们中的每一个都将覆盖实例方法,只需返回并返回。class MyMutableList
class MyImmutableList
IMyCollection
isMutable()
MyMutableList
true
MyImmutableList
false
isMutable()
在这两个类中,都有一个实例方法,该方法 (1) 不使用实例变量,并且 (2) 不影响实例状态。但是,由于语言中的约束(不可能覆盖静态方法),此设计是唯一实用的设计。
另外,我想澄清一个误解(@manouti也这样做):非静态方法不是实例,因为它们使用任何实例变量或影响实例状态;它们是实例方法,因为它们是以这种方式定义的(没有关键字),因此具有隐式参数(在Python等语言中,它实际上是显式的!static
this
很多时候,没有。如果该方法不涉及任何实例状态,则没有理由将其绑定到实例。
当然,静态方法不能被继承或重写,所以这是一个明显的时间,你希望有一个不使用实例状态的实例方法。策略模式就是一个典型的例子。
无论如何,您可能将其绑定到实例的另一种情况是,如果这是一个公共 API,并且您想象将来可能希望将该方法绑定到实例状态。在这种情况下,对于使用 API 的用户来说,向后兼容性问题可能会使将该静态方法转换为实例方法变得困难(或不可能)。