只是我在考虑编写单例类的其他方法。那么这个类是否被认为是单例类呢?
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(使用前将#替换为@)