Java 对于一小段代码,惰性初始化值得吗?

Java 对于一小段代码,惰性初始化值得吗?,java,memory-management,lazy-initialization,Java,Memory Management,Lazy Initialization,我有单例A.classRunnable loadTask可能会被调用,也可能不会被调用,这就是我考虑延迟初始化的原因。我担心内存的使用。所以问题是,延迟初始化是否值得实现?或者函数体的内存消耗比即时初始化的内存多一点,更容易忽略内存消耗差异 我理解函数的定义必须在某处消耗内存 另外,我知道函数体的内存不是在堆中分配的 p.S.Instrumentation.class、sizeOf、Runtime.freemory()仅适用于类字段/属性 class A_LazyInit { Runna

我有单例
A.class
Runnable loadTask
可能会被调用,也可能不会被调用,这就是我考虑延迟初始化的原因。我担心内存的使用。所以问题是,延迟初始化是否值得实现?或者函数体的内存消耗比即时初始化的内存多一点,更容易忽略内存消耗差异

我理解函数的定义必须在某处消耗内存

另外,我知道函数体的内存不是在堆中分配的

p.S.Instrumentation.class、sizeOf、Runtime.freemory()仅适用于类字段/属性

class A_LazyInit {
    Runnable loadTask;
    void load() {
        if(loadTask == null) loadTask = new Runnable() {
            public void run() {
                loadFileFromInternet();
            }
        };
        new Thread(loadTask).start();
    }
    void useMethod() {
        if(isGoodCondition()) load();
    }
}
vs


这里的延迟初始化不会节省任何内存。代码的内存将被保留,无论您是否急切地初始化它(它是在类加载时分配的)


由于初始化loadTask变量不会花费很长时间,因此在任何情况下,使用延迟初始化都不会给您带来好处。

我将利用类已经被延迟初始化的事实

你可以这么做

enum Singleton {
     INSTANCE;

     Singleton() {
         loadFileFormTheInternet();
     }
}

这是线程安全且延迟加载的。

延迟初始化之所以值得,有两个原因:1)它适用于仅在相对罕见的情况下使用的数据结构,因此在存储和/或安装成本方面的节约是值得的。2) 您太懒了,无法返回并修改应用程序启动代码,以便在启动时(或在存在允许初始化的环境时)初始化结构。两者都是使用该技术的正当理由。
enum Singleton {
     INSTANCE;

     Singleton() {
         loadFileFormTheInternet();
     }
}