就像我之前的问题一样,该问题引用了 Effective Java 。这次,我有很多子问题。
特权客户端可以借助该AccessibleObject.setAccessible()方法以反射方式调用私有构造函数。如果需要对此进行防御,请修改构造函数。 究竟如何调用私有构造函数?那是AccessibleObject.setAccessible()什么?
AccessibleObject.setAccessible()
您的专家对单身人士采取什么方法?
// 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; } . . . }
如果我们每次都要检查新实例还是每次都检查同一个实例,第二种方法难道不是更灵活吗?
如果我尝试克隆类/对象怎么办?
单元素枚举类型是实现单例的最佳方法。 为什么?怎么样?
特权派系可以在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,您的专家对单身人士采取什么方法: …
2,您的专家对单身人士采取什么方法:
…
通常情况下,第一个偏爱。 第二种方法(假设您要TestInstance在返回新实例之前测试是否为null)以需要同步或线程不安全为代价获得延迟加载。
TestInstance
当您的第二个示例未将实例分配给TestInstanceat声明时,我写了以上内容。如现在所述,以上考虑是无关紧要的。
如果我们每次必须检查新实例还是每次都检查同一实例,第二种方法是否更灵活?
这与灵活性无关,而与创建一个(唯一的)实例的成本有关。 如果您选择a),则会在类加载时发生。通常很好,因为该类仅在需要时才加载。
当您的第二个示例未将实例分配给TestInstanceat声明时,我写了以上内容。如现在所述,在两种情况下,都将在类加载时创建Singleton。
由于明显的原因,单例不应该允许克隆。会抛出CloneNotSupportedException异常,除非您出于某种原因实现,否则它将自动抛出Cloneable。
Cloneable
单元素枚举类型是实现单例的最佳方法。为什么?如何?
这方面的例子和理由都在书中。你哪一部分不懂