在Java中静态方法与实例方法的决定?

时间:2011-08-26 17:31:28

标签: java

根据我的理解,我们应该只在处理对象状态即实例变量时使用方法。如果方法确实处理对象的状态,则它们应始终声明为类方法,即静态。但仍然在大多数项目中 我已经看到了从未在实例变量上运行的方法,它们也被声明为实例方法(基本上这些方法正在做什么,它们正在使用一些方法参数并在那些方法上进行一些处理并调用其他类).Thats it 。 这些方法不应该声明为类方法,即静态吗?

5 个答案:

答案 0 :(得分:8)

可能答案是肯定的:如果你有一个实际上没有利用实例状态的实例方法,那么它可能应该是static,并且可能被移动到一个助手类,取决于它的作用。

请注意,即使您不访问实例变量,访问实例方法也会使方法失去成为static的资格。此外,如果此方法是一个实例方法,以便将来证明它(预期稍后使用实例状态),那么改变它也是不可取的。

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

答案 1 :(得分:7)

当你必须使用实例方法而非静态方法时,这是一个[可能不完整]列表:

  • 您可以从方法
  • 中访问实例变量/方法
  • 该方法是您实现的抽象方法
  • 该方法是您实现的接口方法
  • 你对长期保持静态的方法有疑问
  • 你声明它synchronized并且不想锁定类,而不是锁定实例
  • 在以非静态方式访问静态方法时会收到警告并且您真正关心它们(有时您无法避免以非静态方式调用,因此您唯一的选择是使它们成为非静态方法)

在所有其他情况下你可能会变得静止。

答案 2 :(得分:4)

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

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

答案 3 :(得分:0)

你不能指望每个人都一直遵循一条路径,无论这是否是最佳实践。首先,我们都是人类。我们有时可以选择不同的方式,而且不应该一直完全正确。甚至框架和图书馆和语言都是由人类创造的,所以错误不应该让你感到惊讶或让你感到尴尬。

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

答案 4 :(得分:0)

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

但是,取整数的平方根也是有效的,我们并不想强迫每个人转换成双精度来取平方根。所以我们转向int并开始设计。它返回了什么?我们可以返回一个int并使其仅用于完美的正方形,或者将结果舍入到最近的int(忽略关于正确的舍入方法的辩论)。但是,如果有人想要一个非整数结果怎么办?我们应该有两个方法 - 一个返回一个int,另一个返回一个double(在某些语言中这是不可能的,而不更改名称)。所以我们决定它应该返回一个双。现在我们实施。但是实现与我们用于double的实现相同。我们复制粘贴吗?我们将实例强制转换为double并调用该实例方法吗?为什么不将逻辑放在可以从两个类访问的库方法中。我们将调用库Math和函数Math.Sqrt。