当前位置: 首页 > 面试题库 >

单例模式

暴骏奇
2023-03-14
问题内容

就像我之前的问题一样,该问题引用了 Effective Java 。这次,我有很多子问题。

  1. 特权客户端可以借助该AccessibleObject.setAccessible()方法以反射方式调用私有构造函数。如果需要对此进行防御,请修改构造函数。
    究竟如何调用私有构造函数?那是AccessibleObject.setAccessible()什么?

  2. 您的专家对单身人士采取什么方法?

        // Approach A
    public class Test{
        public static final Test TestInstance = new Test();
        private Test(){ ... }
        .
        .
        .
    }


    // Approach B
    public class Test{
        private static final Test TestInstance = new Test();
        private Test(){ ... }
        public static Test getInstance() { return TestInstance; }
        .
        .
        .
    }

如果我们每次都要检查新实例还是每次都检查同一个实例,第二种方法难道不是更灵活吗?

  1. 如果我尝试克隆类/对象怎么办?

  2. 单元素枚举类型是实现单例的最佳方法。
    为什么?怎么样?


问题答案:

特权派系可以在AccessibleObject.setAccessible方法的帮助下反射性地调用私有构造函数。如果您需要对此进行辩护,请修改构造函数。我的问题是:如何精确调用私有构造函数?什么是AccessibleObject.setAccessible?

显然,私有的构造函数可以由类本身调用(例如,从静态工厂方法中)。反思地,布洛赫在谈论的是:

    import java.lang.reflect.Constructor;

    public class PrivateInvoker {
        public static void main(String[] args) throws Exception{
            //compile error 
    //      Private p = new Private();

            //works fine
            Constructor<?> con = Private.class.getDeclaredConstructors()[0];
            con.setAccessible(true);
            Private p = (Private) con.newInstance();
        } 
    }

    class Private {
        private Private() {
            System.out.println("Hello!");
        } 
    }

2,您的专家对单身人士采取什么方法:

通常情况下,第一个偏爱。
第二种方法(假设您要 TestInstance在返回新实例之前测试是否为null)以需要同步或线程不安全为代价获得延迟加载。

当您的第二个示例未将实例分配给TestInstanceat声明时,我写了以上内容。如现在所述,以上考虑是无关紧要的。

如果我们每次必须检查新实例还是每次都检查同一实例,第二种方法是否更灵活?

这与灵活性无关,而与创建一个(唯一的)实例的成本有关。 如果您选择a),则会在类加载时发生。通常很好,因为该类仅在需要时才加载。

当您的第二个示例未将实例分配给TestInstanceat声明时,我写了以上内容。如现在所述,在两种情况下,都将在类加载时创建Singleton。

如果我尝试克隆类/对象怎么办?

由于明显的原因,单例不应该允许克隆。会抛出CloneNotSupportedException异常,除非您出于某种原因实现,否则它将自动抛出Cloneable

单元素枚举类型是实现单例的最佳方法。为什么?如何?

这方面的例子和理由都在书中。你哪一部分不懂



 类似资料:
  • 主要内容:介绍,实现,SingleObject.java,SingletonPatternDemo.java,单例模式的几种实现方式,实例,实例,实例,实例,实例,实例单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只

  • 亦称:单件模式、Singleton 意图 单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。 问题 单例模式同时解决了两个问题, 所以违反了单一职责原则: 1、保证一个类只有一个实例。 为什么会有人想要控制一个类所拥有的实例数量? 最常见的原因是控制某些共享资源 (例如数据库或文件) 的访问权限。 它的运作方式是这样的: 如果你创建了一个对象, 同时

  • 一、定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 当单击登陆按钮,页面中出现一个登陆浮窗,这个登陆浮窗是唯一的,无论单击多少次登陆按钮,这个浮窗都只会被创建一次,那么这个登陆浮窗就适合用单例模式来创建。 二、实现原理 要实现单例并不复杂,使用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象。 三、假单例 全局变量不是单例模式,

  • 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppCon

  • 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必

  • 通过 API 调用组件的时候,需要涉及到组件的单例、多例模式。 1.11 版本之后 单例是相对于某一个组件上下文的,如果说组件是单例的,在同一个组件内多次实例化的时候,只有一个实例,对应的视图层也只存在一份;如果说组件是多例的,那么每次实例化的时候都会产生一个新的实例,且对应的视图也是有多份的,它们之间互不影响。 1.11 版本之前 如果说组件是单例的,在多次实例化的时候,只有一个实例,对应的视图