java温习*(10):关于单例模式的常见问题

    技术2022-07-11  108

    饿汉式 //饿汉式-创建对象实例的时候直接初始化 //空间换时间 //在类进行加载的时候,完成了实例化操作,一直存在于jvm中,需要的时候 直接去jvm拿 //静态的属性只会加载一次,第一次实例化的时候分配空间,以后再实例化这个类的时候。不会再分配内存空间 public class SingletonOne { // 1.创建类中私有构造 private SingletonOne() { } // 2.创建该类型的私有静态实例 private static SingletonOne instance=new SingletonOne(); // 3.创建公有静态方法返回静态实例对象 public static SingletonOne getInstance() { return instance; } } 懒汉式 //懒汉式-类内实例对象创建时,并不直接初始化,直到第一次调用get方法时,完成第一次初始化操作 //用时间换空间的编码格式 public class SingletonTwo { // 创建私有构造方法 private SingletonTwo() { } // 创建静态的该类实例对象 private static SingletonTwo instance=null; // 3.创建公有静态方法返回静态实例对象 public static SingletonTwo getInstance() { if(instance==null) { return instance=new SingletonTwo(); }else { return instance; } } } public class Tets { public static void main(String[] args) { // TODO Auto-generated method stub // SingletonOne one=SingletonOne.getInstance(); // SingletonOne two=SingletonOne.getInstance(); // System.out.println(one); // System.out.println(two); SingletonTwo one1=SingletonTwo.getInstance(); SingletonTwo two1=SingletonTwo.getInstance(); System.out.println(one1); System.out.println(two1); }

    输出结果:

    com.imooc.singleton.SingletonTwo@7852e922 com.imooc.singleton.SingletonTwo@7852e922

    常见问题:

    1、public static SingletonOne getInstance() {} a. 该方法为什么用静态的?为什么要用这个类的类型作为返回值? b. 只能叫这个名字么?

    a、getInstance()方法的作用是实现该类对象的返回,因此需要设置该类类型作为方法返回值;至于static,则是因为对于单例模式而言,需要在类外能在无需产生对象实例的情况下,完成这个方法的调用,因此该方法需要设置为static。

    b、方法名并不限定,只是一种推荐命名,见名知义。

    2、关于对象实例化、对象引用、对象声明的关系

    完整的对象实例化的过程,可以分为声明和实例化两部分,这两步可以拆分也可以整合。

    譬如:

    结合这段代码,one表示对象名,也可称为对象引用。

    3、不是说,单例模式只能有一个对象吗,为什么在测试类里出现了两个SingletonOne的对象也不报错呢?

    所谓单例模式只能有一个对象,是指无论应用该类型产生多少对象,都是指向唯一的堆空间,所以测试类中,只是声明了两个对象的引用指向了同一内存空间,不会报错。

    4、单例模式中的类成员是否需要加final修饰?

    从语法层面来说:

    饿汉式:加入final修饰对于模式实现本身无影响

    懒汉式:加入final修饰产生编译报错,提示信息为:无法对final修饰的成员进行操作。

    原因是,final修饰的静态成员,如果在定义时未进行实例化,则需要在静态代码块中去实现,而不能到类方法中才进行实例化。

    从应用层面来说:

    如果饿汉式的程序代码中不仅涉及创建对象及返回的功能,还包括其他的功能,譬如资源回收等,就不能假如final修饰,会影响程序功能实现。

    总结:

    懒汉式中不能加入final。

    如果在饿汉式代码中,对类实例只涉及创建和返回方法,可以加入final修饰。

    Processed: 0.014, SQL: 12