有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

创建不可由GC收集的java类

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

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

谢谢


共 (2) 个答案

  1. # 1 楼答案

    您可以使用枚举单例

    class MySingleton implements MyInterface {
         INSTANCE;
    
         // methods
    }
    

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

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

  2. # 2 楼答案

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

    • 在另一个同样可以访问的类中引用它
    • 将其加载到初始类加载器中(始终可以访问)
    • 将类的实例放入保持可访问的变量中
    • 等等

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


    另一方面。。。如果您真的担心单个实例(而不是类)被垃圾收集,那么单例设计模式的正常实现会考虑:

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

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

    一个public static变量也可以工作,尽管从其他角度来看这是个坏主意