当前位置:编程学习 > JAVA >>

关于单例模式的一个疑惑

代码如下:

 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的?
如果不是静态方法会怎么样? --------------------编程问答-------------------- 不是静态的你就拿不到对象了 --------------------编程问答--------------------
引用 楼主 phoenix_zg 的回复:
代码如下:

 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();
    }
  }

这样还能算单例模式吗?
--------------------编程问答--------------------
引用 3 楼 phoenix_zg 的回复:
那如果我这样写:
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这个单例对象?? --------------------编程问答--------------------
引用 2 楼 kiritor 的回复:
Quote: 引用 楼主 phoenix_zg 的回复:

代码如下:

 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的?
如果不是静态方法会怎么样?

这个是基础语法吧,楼主是忘了吗?
非静态方法是无法访问静态成员变量的。


怎么可能???

你以前定义的非静态方法 就一直没有直接去取过常量类的 变量吗???

都是在静态方法里面做的??那得多大开销啊! --------------------编程问答--------------------
引用 3 楼 phoenix_zg 的回复:
那如果我这样写:
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 直接类名.方法名. --------------------编程问答-------------------- 自己问一下自己,构造器已经被私有化了,不静态的话,我怎么调用这么方法? --------------------编程问答--------------------
引用 12 楼 u010289977 的回复:
自己问一下自己,构造器已经被私有化了,不静态的话,我怎么调用这么方法?


用反射,绕过检查,霸王硬上弓。 --------------------编程问答--------------------
引用 13 楼 beowulf2005 的回复:
Quote: 引用 12 楼 u010289977 的回复:

自己问一下自己,构造器已经被私有化了,不静态的话,我怎么调用这么方法?


用反射,绕过检查,霸王硬上弓。


我的娘呀。。。不带这么暴力的 --------------------编程问答-------------------- 即使撇开其它能不能调用到,是不是符合单例模式的因素先不说,
把static initializer换成instance initializer就会造成潜在的StackOverflowError的隐患 --------------------编程问答-------------------- 单例设计模式 你要记住三部  
1.因为创建对象都要初始化构造函数,只要将本类的构造函数私有化,其他程序就不能创建本的对象
2.在本类中创建本类的对象 并私有化
3.对外提供访问本类对象的方法 --------------------编程问答--------------------
public class Singleton {  
  
    /* 私有构造方法,防止被实例化 */  
    private Singleton() {  
    }  
  
    /* 此处使用一个内部类来维护单例 */  
    private static class SingletonFactory {  
        private static Singleton instance = new Singleton();  
    }  
  
    /* 获取实例 */  
    public static Singleton getInstance() {  
        return SingletonFactory.instance;  
    }  
  
    /* 如果该对象被用于序列化,可以保证对象在序列化前后保持一致 */  
    public Object readResolve() {  
        return getInstance();  
    }  
}  
--------------------编程问答-------------------- 单例嘛,全局只允许有1个对象存在嘛。

你创造个啥都得通过 静态的static

原因嘛,构造私有了,你咋new对象?

比如说,一个JDBC的连接对象 Connection

你写了一个系统,肯定全局就只要这么一个Connection

那么就单例实现一个。

--------------------编程问答--------------------
引用 18 楼 N27741 的回复:
单例嘛,全局只允许有1个对象存在嘛。

你创造个啥都得通过 静态的static

原因嘛,构造私有了,你咋new对象?

比如说,一个JDBC的连接对象 Connection

你写了一个系统,肯定全局就只要这么一个Connection

那么就单例实现一个。
整洁 --------------------编程问答-------------------- 因为你都是单例设计模式了,不让用户new对象,所以你得提供一个接口提供给用户一个对象了,但是这个类是不能new的所以要调用方法只能是静态方法,来给用户返回一个对象。 --------------------编程问答-------------------- 只有静态才可以被别的类调用,不然再没有别的方法可以掉了,你想啊,构造都私有了,不然怎么访问这个类的方法 --------------------编程问答-------------------- 除
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,