静态与非静态

时间:2013-12-15 08:11:40

标签: java garbage-collection

直到几个星期前,我想我知道何时制作字段和方法staticnon-static。例如,当一个字段(比如另一个类的对象)对于该类的任意数量的对象是唯一的时,它应该是static

但接下来几周我就读到了JVM垃圾收集。

我知道static字段永远不会被垃圾收集并一直保留在内存中,除非类加载器本身是垃圾收集的。

但是如果我不创建那个字段static,至少它会被垃圾收集。

因此,在使字段/方法保持静态与否之间似乎存在 非常细线

任何人都可以在决定时向我解释 细线 ,以便我的应用程序更有效率。

4 个答案:

答案 0 :(得分:8)

它可能很薄但有明显的区别。当一个字段与一个类的任何实例都没有相关时,你将它声明为静态。

静态字段的简单用法是使用final关键字声明常量,例如:

public static final int MAX_ALLOWED = 10;

方法也是如此。当方法不依赖于类的实例或类的状态时,将方法声明为静态。这就是静态方法不能使用类的实例成员的原因。

答案 1 :(得分:3)

这些不是强制性规则,但最好遵循它们:

何时使用静态字段:

  1. 常量静态字段的最佳用法是常量,也应为final
  2. ThreadLocals 大多数情况下,您将线程局部变量定义为static,否则通常会丢失对它们的引用。但是不要忘记在没有更多使用时释放它们的内容(或者你会遇到内存泄漏)。大多数情况下,这些变量也是 final
  3. 非常罕见的情况,你应该保留一个(语义上)单一对象的引用,可以从许多地方访问。 (例如,在HibernateUtils中引用Hibernate SessionFactory
  4. 请记住,静态字段在应用程序运行期间通常应该是不可变的(它们有时会在应用程序的启动和拆除期间被修改)。

    何时使用静态方法:

    1. 辅助工具方法这是正常情况,当方法不依赖于其包含对象的状态时。这些方法很有用,无需实例化任何对象即可访问。
    2. 工厂方法工厂方法是使用静态方法的另一个很好的例子。
    3. 不依赖于对象状态的私有方法,当私有方法不依赖于对象的状态时,定义它static以获得一点性能要好得多。
    4. void main(String [])方法也应该是静态的。

答案 2 :(得分:3)

静态字段是概念在将其用作提高应用程序效率的方法之前,您应该仔细考虑。

如您所知,当static修饰符包含在字段中时,不需要该类的实例来使用它。因此,它对整个应用程序具有相同的值。一方面,如果您没有正确地序列化访问权限,它可能会导致多线程读/写环境中出现许多错误;另一方面,如果您尝试创建singleton pattern(一个字段),那将是一件好事。具有在应用程序生命周期内不会发生变化的值,因此不需要GC

总的来说,您应该避免读/写静态字段,它会在您的应用程序中引入更多错误。在同一类的许多实例中具有相同的值不被认为是OO设计中静态字段的良好用例。不是因为它更低或更有效,而是因为它打破了encapsulation的概念。

答案 3 :(得分:0)

不对垃圾收集进行static字段。这是一个值得考虑的全新领域。如果static字段的内存很大,是的,你应该non-static