【问题标题】:Create java class not collectable by GC创建 GC 无法收集的 java 类
【发布时间】:2016-01-06 07:34:56
【问题描述】:

我想创建一个类: - 只有一个实例 - 在我的应用程序的整个生命周期中都可以访问。 - 类不必被垃圾收集器销毁。

我可以通过使用静态或单例模式来实现吗?

谢谢

【问题讨论】:

  • 单身人士应该这样做。

标签: java class static singleton


【解决方案1】:

你可以使用枚举单例

class MySingleton implements MyInterface {
     INSTANCE;

     // methods
}

理想情况下,这样的单例应该是无状态的。有状态的单例在单元测试中很难/容易出错。

如果它不是无状态的,我建议改用依赖注入。即在您的应用程序加载时创建一次对象并将其传递给所有需要它的实例。

【讨论】:

    【解决方案2】:

    确保不会被垃圾回收的方法是确保它保持可访问性。你可以:

    • 在另一个可访问的类中引用它,
    • 在初始类加载器中加载它(始终可以访问),
    • 将类的一个实例放入一个仍可访问的变量中,
    • 等等。

    实际上,除非您的类是使用您自己创建的类加载器动态加载的,否则该类不太可能被 GC 卸载/销毁。


    另一方面...如果你真的担心单例instance(不是)被垃圾收集,单例设计模式的正常实现照顾好这个:

    public class MySingleton {
        private static Integer instance = new Integer(42);
    
        public static Integer getInstance() {
            return instance;
        }
    }
    

    只要MySingleton 类保持可访问性,static 变量就可以访问...这通常是在应用程序运行的生命周期内;见上文。

    public static 变量也可以使用,尽管从其他角度来看这是个坏主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多