标签:turn 实例化 效果 覆盖 组合模式 私有 加载 延迟加载 空间
如果一个类中只有方法会被大量使用,没必要每次都创建一个新实例,只创建一个实例,每次都调用这个实例的方法就可以
让一个类只创建一个对象。
package xiushifu.singleton; //如果一个类中只有方法会被大量使用,没必要每次都创建一个新实例,只创建一个实例,每次都调用这个实例的方法就可以 //让一个类只创建一个对象。 //在内部创建一个实例,构造器全部设置为private,所有方法均在该实例上改动,在创建上要注意类的实例化只能执行一次,可以采用许多种方法来实现,如Synchronized关键字,或者利用内部类等机制来实现。 //1.让构造方法变成私有 //2.通过static控制创建 public class SingleTon { private SingleTon(){}//将构造方法变为私有,不能通过外部随意创建 //饿汉式 private static SingleTon singleton = new SingleTon(); //static 表示所有实例的这个变量都被存在一个空间内,每次修改都会覆盖掉之前的值,保证了实例只有一个。 public static SingleTon newInstance(){ //可以通过class直接调用。 return singleton; //因为属性也是私有的,所以需要一个公有方法来获取。 } //懒汉式 使用这种则不能直接在class里直接用this.singleton了,否则会空指针。 // private static SingleTon singleton; //static 表示所有实例的这个变量都被存在一个空间内,每次修改都会覆盖掉之前的值,保证了实例只有一个,不直接创建实例,需要时再创建。 // // public static SingleTon newInstance(){ //可以通过class直接调用。 // if(singleton == null){ //判断之前是否被调用过,如果是第一次则创建实例 // singleton = new SingleTon(); // } // return singleton; //因为属性也是私有的,所以需要一个公有方法来获取。 // } public static void main(String[] args) { // SingleTon.singleton就是一个初始化完毕的实例,它是属于类的,这样保证了只有一个。 SingleTon s1 = SingleTon.singleton;//因为属性是private,所以这种写法只能在本类中使用 SingleTon s2 = SingleTon.singleton; System.out.println(s1 == s2);//判断s1和s2的内存地址hashcode值是否一致。 返回一个16进制数字 System.out.println(s1.equals(s2));//底层代码其实和s1==s2一样 SingleTon s3 = SingleTon.newInstance();//可以在外部类中使用,和上面效果一样 SingleTon s4 = SingleTon.newInstance(); System.out.println(s3 == s4); System.out.println(s1 == s3); } }
共有方法返回单例对象:
饿汉式:立即加载 启动项目就已经加载了,所以可能会浪费空间,不会产生空指针。 上面的是饿汉式
懒汉式:延迟加载 用到了才会加载,可能会异常,用到了才会加载(在public方法中new)不会浪费空间。
生命周期托管:其他对象处理
标签:turn 实例化 效果 覆盖 组合模式 私有 加载 延迟加载 空间
原文地址:https://www.cnblogs.com/clamp7724/p/11604422.html