关于单例模式的一个疑惑
代码如下:public class Singleton {
private final static Singleton INSTANCE = new Singleton();
// Private constructor suppresses
private Singleton() {}
// default public constructor
public static Singleton getInstance() {
return INSTANCE;
}
}
为什么方法要static的?
如果不是静态方法会怎么样? --------------------编程问答-------------------- 不是静态的你就拿不到对象了 --------------------编程问答--------------------
这个是基础语法吧,楼主是忘了吗?
非静态方法是无法访问静态成员变量的。 --------------------编程问答-------------------- 那如果我这样写:
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
// Private constructor suppresses
private Singleton() {}
private static Singleton getTheInstance() {
return INSTANCE;
}
public Singleton getInstance() {
return getTheInstance();
}
}
这样还能算单例模式吗?
--------------------编程问答--------------------
这样写,我理解为不能算单例模式了
你这样写了以后 请问 你怎么使用INSTANCE这个单例对象?? --------------------编程问答--------------------
怎么可能???
你以前定义的非静态方法 就一直没有直接去取过常量类的 变量吗???
都是在静态方法里面做的??那得多大开销啊! --------------------编程问答--------------------
那如果我这样写:
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
// Private constructor suppresses
private Singleton() {}
private static Singleton getTheInstance() {
return INSTANCE;
}
public Singleton getInstance() {
return getTheInstance();
}
}
这样还能算单例模式吗?
单例模式 是共享一个对象,,你这样子之后 有一个问题getInstance()不是静态方法 ,,需要new出来,违背单例模式的原理。。。。并且Singleton这个类没有公共的 构造方法,,此路不通,
--------------------编程问答-------------------- 如果不是static的话,你要用getInstance方法是否必须new一下,但是如果你new时候就不是单例了,而是每次都创建一个新的。
所以单例最终概念是始终获取一个相同对象,好处是可以更好节约空间,节约时间,并且可以很好解决多线程以及并发很高的问题! --------------------编程问答-------------------- 一个方法是定义为静态的还是非静态的,你就要考虑到这个方法里头
是否会用到实例成员,如果没有实例成员就定义为static,这样的
方法可以称为工具方法。当然理论上你也可以定义为实例的,但是不
建议你这么做,因为这也算是java中一个约定俗成的了,当然没有
明确规定一定要用static,只是这一个小地方在将来工作时也就能
看出一个人对java细节的把握了。你也可以去看一下jdk中的Math就
都是静态的,那就只是一个工具类而已。 --------------------编程问答-------------------- 单例,就是单一实例。将构造器私有化,然后声明一个静态私有本类属性,并调用构造器初始化,再提供一个静态对外方法,每次都返回此属性,就实现“单例”了。
或者反过来讲:我们没法再创建一个此类的实例。 --------------------编程问答-------------------- 静态方法只能访问静态成员。 --------------------编程问答-------------------- 单利只能自己new一个自己出来, 外部类是无法new滴,因为他滴构造器是private滴,如果你的是非static .那么你就得不到这个对象.. static 直接类名.方法名. --------------------编程问答-------------------- 自己问一下自己,构造器已经被私有化了,不静态的话,我怎么调用这么方法? --------------------编程问答--------------------
自己问一下自己,构造器已经被私有化了,不静态的话,我怎么调用这么方法?
用反射,绕过检查,霸王硬上弓。 --------------------编程问答--------------------
自己问一下自己,构造器已经被私有化了,不静态的话,我怎么调用这么方法?
用反射,绕过检查,霸王硬上弓。
我的娘呀。。。不带这么暴力的 --------------------编程问答-------------------- 即使撇开其它能不能调用到,是不是符合单例模式的因素先不说,
把static initializer换成instance initializer就会造成潜在的StackOverflowError的隐患 --------------------编程问答-------------------- 单例设计模式 你要记住三部
1.因为创建对象都要初始化构造函数,只要将本类的构造函数私有化,其他程序就不能创建本的对象
2.在本类中创建本类的对象 并私有化
3.对外提供访问本类对象的方法 --------------------编程问答--------------------
public class Singleton {--------------------编程问答-------------------- 单例嘛,全局只允许有1个对象存在嘛。
/* 私有构造方法,防止被实例化 */
private Singleton() {
}
/* 此处使用一个内部类来维护单例 */
private static class SingletonFactory {
private static Singleton instance = new Singleton();
}
/* 获取实例 */
public static Singleton getInstance() {
return SingletonFactory.instance;
}
/* 如果该对象被用于序列化,可以保证对象在序列化前后保持一致 */
public Object readResolve() {
return getInstance();
}
}
你创造个啥都得通过 静态的static
原因嘛,构造私有了,你咋new对象?
比如说,一个JDBC的连接对象 Connection
你写了一个系统,肯定全局就只要这么一个Connection
那么就单例实现一个。
--------------------编程问答--------------------
单例嘛,全局只允许有1个对象存在嘛。
你创造个啥都得通过 静态的static
原因嘛,构造私有了,你咋new对象?
比如说,一个JDBC的连接对象 Connection
你写了一个系统,肯定全局就只要这么一个Connection
那么就单例实现一个。
补充:Java , Java SE