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

单例公共静态最终

顾骏祥
2023-03-14
问题内容

我一直想知道Java中的单例。按照惯例,单例设置如下:

private static MyClass instance = null;
public static MyClass getInstance(){
    if (instance == null){
        instance = new MyClass();
    }
    return instance;
}
private MyClass(){}

最近,我切换到使用以下内容:

public static final MyClass instance = new MyClass();
private MyClass(){}

由于没有空检查,因此它更短,更快捷,而且打字MyClass.instance对我来说比打字好MyClass.getInstance()。有什么理由不能使第二种方法成为主流呢?


问题答案:

第一个版本在第一次实际需要时创建实例,而第二个版本(较短的版本)在初始化类后立即运行构造函数

类或接口类型T将在以下任何一种首次出现之前立即初始化:

  • T是一个类,并创建T的实例。
  • T是一个类,并调用T声明的静态方法。
  • 分配由T声明的静态字段。
  • 使用由T声明的静态字段,并且该字段不是常量变量(第4.12.4节)。
  • T是顶级类(第7.6节),并执行词法嵌套在T中的断言语句(第14.10节)(第8.1.3节)。[…]

调用类Class和包java.lang.reflect中的某些反射方法也会导致类或接口初始化。

如果构造函数中的代码进行了昂贵的操作,则首次使用时的初始化会提高性能,从而可以加快应用程序的启动速度。另一方面,第二个版本易于阅读,并且自动具有线程安全性。

无论如何,最新技术不会以任何方式创建单例:对于一堆KB,您可以获得依赖注入库,使其适合您,并处理更复杂的场景(例如,查看Spring和AOP支持的注入)。
)。

注意:第一个版本在粘贴的代码段中不是线程安全的



 类似资料:
  • 问题内容: 和之间有什么区别? 例如 : 要么 问题答案: 尽管您 确实 希望遵守约定,但在功能上没有什么区别(字节码将 完全相同 ),请访问JLS-8.3.1。场修饰符: __ 这将是奇怪的,看.. 我也建议您访问checkstyle。 编辑: 从同一页面链接到该部分: http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls

  • 问题内容: [已更新,对更改感到抱歉,但现在是真正的问题] 对于getCanonicalPath()方法中的异常,我无法在其中包括try-catch- loop。我试图通过方法来解决问题,然后在其中声明值。问题是它是最终版本,我无法更改。因此,如何将startingPath作为“ public staticfinal”。 问题答案: 这个名字很好。您忘记声明类型了。 解决这个问题,您当然会意识到如

  • 若需要在 San CLI UI内建的http服务器上暴露一些静态文件,例如:为自定义视图指定图标。可以通过在插件包根目录里可选的放置一个public文件夹,这个文件夹里的任何文件都会暴露至 /_plugin/:id/* 的http路由。 例如,如果将 x-logo.png 文件放置到 san-cli-ui-widget-x/public/ 文件夹,那么 cli-ui 加载插件的时候可以通过 /_p

  • 问题内容: 首先,如果这是一个非常愚蠢的问题,请原谅我,我只是想学习这种语言的核心。我正在阅读《有效的Java》,并且第一章讨论了静态工厂方法与构造方法。他们的利弊。令我困惑的几件事是: 静态工厂方法返回的对象的类是非公共的 -究竟是什么意思? 与构造函数不同,每次调用静态工厂方法都不需要创建新对象 -这是怎么发生的?我仅调用工厂方法来获取新对象,是否将检查方法放入工厂方法中以检查对象是否已存在?

  • 问题内容: 给定下面的Java代码,您可以在Ruby类中最接近地表示这两个变量吗?而且,在Ruby中是否可以像Java中那样区分和变量? 问题答案: Ruby中确实没有等效的构造。 但是,您似乎犯了一个经典的移植错误:您有一种使用语言A 的 解决方案 ,然后尝试将其翻译为语言B,这时您真正应该做的就是找出 问题 ,然后找出解决方法使用语言B。 我不能完全确定您要从那个小的代码段中解决什么问题,但是