黑马程序员技术交流社区

标题: 单例模式 能不能这样写 [打印本页]

作者: 小Zeor………    时间: 2014-2-27 00:14
标题: 单例模式 能不能这样写
class Single {

        private Single(){}

       
        public static Single a = new Single();


       
}

作者: 不再散步    时间: 2014-2-27 00:35
可以的,private Single(){} 构造函数私有化 这样别人就不能构造该类的对象的了。另外,楼主需要添加成员函数将自己生产的public static Single a返回给调用者,不然别人没法使用。
作者: 位俊鹏    时间: 2014-2-27 00:43
有了构造方法,但要对外提供访问方式啊.不然就用不了.
还有不能用public来修饰,要用private修饰.以防止外界用"类名. a "调用.
作者: 平凡成就非凡    时间: 2014-2-27 00:53
定义静态生命周期太长啦吧,太消耗资源啦。
作者: 张稳    时间: 2014-2-27 00:54
综合了这两句, private static Single a = new Single();
public static Single getInstance(){
   return a;
}
可以的,楼上说的那个明显就没有在意到你的实例变量Single已经设置成public了
不过这样非主流不是挺好,清一色的private的成员变量比较好,符合面向对象的设计,谁拥有数据,设置成私有随提供操作数据的方法
作者: 李白衣    时间: 2014-2-27 10:35
这样写确实是可以的,你写的其实就是枚举吧。
public enum Single {
        ME
}
枚举的构造函数就是私有的。
枚举的成员只有一个的时候,也可以用于单例设计模式的。
作者: 小马过河    时间: 2014-3-5 00:42
单例的说明,字面说,单是单个,唯一的意思。例是实例的意思。
单例是保证对象的唯一性。
无论饿汉式还是懒汉式。
都建立在一个基础上,构造私有,外部无法创建对象。
     而无法创建对象的情况下要得到单例的对象该怎么办呢?(无视反射核武!)只能调用获取对象的方法,返回对象。而且没有对象的时候只能是类名调用,类名调用的前提那么返回对象的方法就必须是静态的。
    再接着而静态的方法只能访问静态的成员变量或者成员函数,以至于你在外部new一个对象,对象也必须修饰Static。这一切都是相辅相成的哦。
    楼主你写的方法还不完整,因为没有返回对象的方式。
     而由于你是先创建的对象,而没有经过调用方法再判断对象是否为空,然后创建以及return对象的步骤,所以可以理解为你写的是一个不完整的饿汉式单例哦
   这么深入浅出的回答,丝丝入扣。斑竹不给分说不过去啊。
作者: 小马过河    时间: 2014-3-5 00:49
李白衣 发表于 2014-2-27 10:35
这样写确实是可以的,你写的其实就是枚举吧。
public enum Single {
        ME

   回答正确,枚举也是单例的一种体现,为了保证元素的唯一性,避免被外部调用构造。
特别进行了私有。
   但是要注意的是,任何一个类,或者方法进行了封装。不仅仅要完成隐藏代码的实现细节,
更要提供公共的对外访问方式,不然这么做就没有意义。(不要跟我说反射)
   比如抽象类不能进行实例化,但是抽象方法可以被重写,非抽象可以被多条调用,成员变量也是一个道理。
   包括接口,也有其必须被重写覆盖的规则。
所以枚举也不例外,也必须添加入口,根据需求写调用语句哟,至于得到什么,就另说了。
作者: 小马过河    时间: 2014-3-5 00:59
平凡成就非凡 发表于 2014-2-27 00:53
定义静态生命周期太长啦吧,太消耗资源啦。

我再科普一下,赚分。
请注意哦
在JDK中,Runtime类的底层,其实就是单例。
源码就是饿汉式,对象在函数外部创建好了。
虽然牺牲了空间(仅仅一个对象实在是不值一提),但是线程更安全。
这不是我说的,这是SUN公司的选择,跟着老大有饭吃。
这才有开发用饿汉,面试吹懒汉的说法。
为什么这么说呢?那么就要说到懒汉式单例的特点。
懒汉式是在外部定义null的对象,方法内部进行null的判断,然后创建,再返回对象,看起来
耍了一套组合拳,很帅很花哨。有是延迟加载的思想又是判断什么的,啧啧多专业。实际上
复杂也带来了安全问题。
因为这样就满足了线程安全判断的条件,是否有共有元素(创建的对象),是否被多条语句执行。
(创建对象语句判断对象语句返回对象语句..)然后是多个线程条件(这个是可能具备的。)
也就是说,一旦外部的人有心,就有可能建立线程,从而产生隐患了。
  斑竹,加精给分成不,又说了这么多




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2