Java中单例的其他方式[重复]

2024-05-16

只是我在考虑编写单例类的其他方法。那么这个类是否被认为是单例类呢?

      public class MyClass{
            static Myclass myclass;

            static { myclass = new MyClass();}

            private MyClass(){}

            public static MyClass getInstance()
            { 
                return myclass;
            }
       }

因为静态块只运行一次。


不它不是。你没有声明myClass private static final,也不getInstance() is static。该代码也不能真正编译。

这是辛格尔顿 http://en.wikipedia.org/wiki/Singleton_pattern idiom:

public class MyClass {
    private static final MyClass myClass = new MyClass();

    private MyClass() {}

    public static MyClass getInstance() {
        return myClass; 
    }
}

它应该是private,这样其他人就无法直接访问它。它应该是static所以只有其中之一。它应该是final以便它不能被重新分配。您还需要实例化它directly在声明期间,这样您就不需要(那么多)担心线程。

如果加载成本很高并且您更喜欢单例的延迟加载,那么请考虑单例支架 http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom按需初始化而不是在类加载期间进行初始化的习惯用法:

public class MyClass {
    private MyClass() {}

    private static class LazyHolder {
        private static final MyClass myClass = new MyClass();
    }

    public static MyClass getInstance() {
        return LazyHolder.myClass;
    }
}

然而,您应该对是否需要一个大问号辛格尔顿或不。很多时候是不需要的。Just静态变量、枚举、工厂类和/或依赖注入通常是更好的选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中单例的其他方式[重复] 的相关文章

随机推荐