2011-04-23 38 views
3

将方法声明为静态方法有什么优点,除了可以在不实例化类的情况下调用方法吗?除了调用方便之外,java中是否有使用静态方法/函数的方法?

+1

共同主题覆盖其他地方1. http://stackoverflow.com/questions/538870/java-static-methods-best-practices 2. http:// stackoverflow。com/questions/658407/static-methods 3. http://stackoverflow.com/questions/2671496/java-when-to-use-static-methods 4. http://stackoverflow.com/questions/752758/is-使用一个静态方法一个坏事 – 2011-04-23 03:51:20

回答

4

不需要实例化类来调用方法本身就是一个优点。考虑一些方法库,比如java.lang.Math。

静态方法也用作工厂方法 - 您调用静态方法来获取对象 - 通常是某个接口的实现。这个想法是,该方法可以根据您传递的参数找出为您建立的具体实现。如果你必须有一个对象实例,然后才能调用这样的方法,那么你可以有鸡与鸡蛋,或者创建第二个类的实例,只是调用工厂方法来给你第一个实例。

您可能还会发现this StackOverflow question on whether or not methods should be static by default感兴趣,特别是接受的答案。

2

使用static方法有很多原因。这里有几个例子:

  1. 设置一个参数是相关的类的每个实例,如时间格式(24小时对AM/PM),当你有很多的时钟。
  2. 提供与更大/其他数据无关的单一操作(如Math类,如QuantumMechanic提到的)。
  3. 限制使用一个实例(singleton),并从不同的地方提供对它的操作。

最重要的是,即使你OO编程,这并不意味着,每一个东西都是一个对象,每个方法需要一个对象上调用,有些方法是独立的,并迫使OO模式他们似乎像一个不好的做法。我甚至不记得我编写的一个应用程序没有使用静态方法。

+0

即使同意你,我坚信静态方法滥用是一个更大的错误。这是严密耦合和意大利面代码的根本原因之一 - 静态方法不强制通过合同进行设计,它们使得单元测试变得更加困难,它们不灵活且难以维护。 OP似乎是一个初学者,对于所有初学者的OO程序员,我必须这样说:**首先**学习如何编程类,然后**考虑静态方法。 – rsenna 2011-04-23 04:30:06

1

我不认为静态方法完全一样的优势 - 我猜必要之恶得多拨付。

当你设计一个类时,有时他/她会得到一个没有其他自然选项但声明一个静态方法的点。典型的例子是编写一个实例计数器,当你需要跟踪一个类的所有实例时:明确的做法是声明一个静态私有计数器和一个公共静态getter方法。

静态方法在处理本质上不是“面向对象”的功能时也很方便:辅助方法和多用途库通常被声明为静态方法。尽管如此,很多时候这是设计不良的一个症状 - 这些所谓的“通用”方法可能会被封装在真实对象中,并带有更多的想法,所以在做出这样的决定时应该小心。

所以请记住,静态只是变相全球,而且伤害了面向对象编程的根基。实际上,一些OO语言完全缺乏静态声明(例如Scala为了静态方法的相同目的而使用companion singletons)。