2011-08-26 96 views
4

根据我的理解,我们应该只在处理对象状态(即实例变量)时才使用方法。如果方法处理对象的状态,它们应该总是被声明为类方法,即静态的。但仍然在大多数项目中 我已经看到了从未对实例变量进行操作的方法,它们也被声明为实例方法(基本上这些方法正在做什么,它们正在使用某些方法参数并对该部分做了一些处理,调用其他类)。这就是它。 不应该将这些方法声明为类方法,即静态吗?在java中的静态方法vs实例方法的决定?

回答

7

这是有可能的答案是肯定的:如果你有没有采取实际的实例状态的优势的实例方法,那么它也许应该是static,并可能转移到这取决于它的辅助类确实。

请注意,即使您不访问实例变量,访问实例方法也会使方法不能成为static。另外,如果这个方法是一个实例方法,以便将来能够抵抗它(预期稍后使用实例状态),那么改变它也不是可取的。

同样重要的是公共非静态方法可以被子类继承和重写,因此使它们实际上可能以意想不到的方式破坏代码。

+0

谢谢dlev​​。你能否稍微解释一下你的陈述,即“注意,即使你不访问实例变量,访问实例方法也会使方法不能成为静态资格” –

+0

我的意思是如果你有一个方法不能访问instnace状态,如果它*调用另一个实例方法,它仍然不能是'静态'。 – dlev

+0

如何调用另一个实例方法使某个方法不成为静态资格?对不起,麻烦你了。请承担我。 –

1

你不能指望每个人都始终遵循一条道路,无论是否是最佳实践。首先,我们都是人类。我们可以选择一种有时不同的方式,而这种方式不应该一直是完全正确的。即使框架和图书馆和语言是由人类创建的,所以错误不应该让你感到惊讶,也不会让你感到困扰。

对于其他一切,我同意dlev。

+0

这是一个很好的观点,人们会犯错误。有一个实例方法通常不是什么大事,它可能是“静态”的,实际上它总是发生。 – dlev

7

这里有一个[可能不完整]列表时,必须使用实例方法在静态的:

  • 访问实例变量/从方法
  • 方法中的方法是,你实现
  • 抽象方法
  • 的方法是,你实现
  • 您对方法的怀疑在长期停留静态接口方法
  • 声明它​​并且不想锁定班级,而是锁定实例
  • 您以非静态方式访问静态方法时会收到警告,并且您真的关心它们(有时您无法避免在非所以你唯一的选择是让他们的方法是非静态的)

你可能在所有其他情况下可以静态。

3

静态方法的缺点是它们将调用者与实现紧密耦合。实例方法可以被重写,也可以是接口方法的多个实现之一。

换句话说,实例方法可以促进松耦合,可测试性和重用。

0

假设我们正在设计一种新语言,我们希望Sqrt是一个实例方法。所以我们看一下双人班并开始设计。它显然没有输入(除了实例)并返回一个double。我们编写和测试代码。完美。

但是,取整数的平方根也是有效的,我们不希望强制每个人都转换为双精度来取平方根。所以我们转向int并开始设计。它返回什么?我们可以返回一个int并使其仅适用于完美平方,或将结果四舍五入到最接近的整数(忽略关于现在正确舍入方法的争论)。但是如果有人想要一个非整数结果呢?我们是否应该有两个方法 - 一个返回一个int,一个返回double(这在某些语言中不可能改变名称)。所以我们决定它应该返回一倍。现在我们执行。但是这个实现和我们用于double的实现是一样的。我们是否复制并粘贴?我们是否将该实例转换为double并调用该实例方法?为什么不把逻辑放在可以从两个类中访问的库方法中。我们将调用库Math和函数Math.Sqrt。