单例延迟加载模式

发布于 2025-01-06 14:37:58 字数 393 浏览 1 评论 0原文

我正在尝试编写一个单例延迟加载模式。这是课程:

public class IMDBLookup {

    private static class LazyLoad {
        private static final IMDBLookup IMDB_LOOKUP;

        static {
            IMDB_LOOKUP = new IMDBLookup();
        }
    }

    public static IMDBLookup getInstance() {
        return IMDBLookup.LazyLoad.IMDB_LOOKUP;
    }
}

我想知道我是否以正确的方式做这件事?

提前致谢。

I am trying to write a Singleton Lazy Loading Pattern. Here is the class:

public class IMDBLookup {

    private static class LazyLoad {
        private static final IMDBLookup IMDB_LOOKUP;

        static {
            IMDB_LOOKUP = new IMDBLookup();
        }
    }

    public static IMDBLookup getInstance() {
        return IMDBLookup.LazyLoad.IMDB_LOOKUP;
    }
}

I am wondering whether or not I am doing it in a right way?

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

回忆凄美了谁 2025-01-13 14:37:59

您考虑克隆和克隆的建议连载

import java.io.Serializable;

public class DBConnectionInner implements Cloneable, Serializable {

    private static final long serialVersionUID = 1173438078175185035L;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return new CloneNotSupportedException("CLONE NOT SUPPORT FOR SINGTELTON");
    }

    protected Object readResolve() {
        return getInstance();
    }

    private DBConnectionInner() {}

    static DBConnectionInner getInstance() {
        System.out.println("DBConnectionInner getInstance");
        return LazyInit.instance;
    }

    public static class LazyInit {
        private static final DBConnectionInner instance = new DBConnectionInner();
    }

}

The advice you to think about clone & serialize

import java.io.Serializable;

public class DBConnectionInner implements Cloneable, Serializable {

    private static final long serialVersionUID = 1173438078175185035L;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return new CloneNotSupportedException("CLONE NOT SUPPORT FOR SINGTELTON");
    }

    protected Object readResolve() {
        return getInstance();
    }

    private DBConnectionInner() {}

    static DBConnectionInner getInstance() {
        System.out.println("DBConnectionInner getInstance");
        return LazyInit.instance;
    }

    public static class LazyInit {
        private static final DBConnectionInner instance = new DBConnectionInner();
    }

}
左耳近心 2025-01-13 14:37:58

为了简单起见,我更喜欢使用枚举。

public enum IMDBLookup {
    INSTANCE;
    // add fields and methods here.
}

I prefer to use enum for simplicity.

public enum IMDBLookup {
    INSTANCE;
    // add fields and methods here.
}
黑凤梨 2025-01-13 14:37:58

这是正确的。为了简洁起见,您可能希望将内部(持有者)类简化为private static final IMDBLookup IMDB_LOOKUP = new IMDBLookup();(以摆脱静态初始化程序块。)

That is correct. You may want to simplify the inner (holder) class as private static final IMDBLookup IMDB_LOOKUP = new IMDBLookup(); for brevity (to get rid of the static initializer block.)

套路撩心 2025-01-13 14:37:58
public class IMDBLookup {

    private IMDBLookup(){
        // without this I do not get why is it a singleton
        // anyone could create instances of your class by the thousands
    }

    private static class LazyLoad {
        private static final IMDBLookup IMDB_LOOKUP;

        static {
            IMDB_LOOKUP = new IMDBLookup();
        }
    }

    public static IMDBLookup getInstance() {
        return IMDBLookup.LazyLoad.IMDB_LOOKUP;
    }
}

你可能应该使用枚举(不完全确定我这样做是对的)

public class IMDBLookup {

    private IMDBLookup(){
    }

    private static enum LazyLoad {
        IMDB_LOOKUP_INSTANCE;
        private static final IMDB_LOOKUP = new IMDBLookup();
    }

    public static IMDBLookup getInstance() {
        return LazyLoad.IMDB_LOOKUP_INSTANCE.IMDB_LOOKUP;
    }
}
public class IMDBLookup {

    private IMDBLookup(){
        // without this I do not get why is it a singleton
        // anyone could create instances of your class by the thousands
    }

    private static class LazyLoad {
        private static final IMDBLookup IMDB_LOOKUP;

        static {
            IMDB_LOOKUP = new IMDBLookup();
        }
    }

    public static IMDBLookup getInstance() {
        return IMDBLookup.LazyLoad.IMDB_LOOKUP;
    }
}

and you should probably use an enum (not completely sure I do this right)

public class IMDBLookup {

    private IMDBLookup(){
    }

    private static enum LazyLoad {
        IMDB_LOOKUP_INSTANCE;
        private static final IMDB_LOOKUP = new IMDBLookup();
    }

    public static IMDBLookup getInstance() {
        return LazyLoad.IMDB_LOOKUP_INSTANCE.IMDB_LOOKUP;
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文