Java 单例类何时优于只有静态方法的类?

Java 单例类何时优于只有静态方法的类?,java,singleton,Java,Singleton,单例类何时优于只有静态方法和私有默认构造函数的类 请投票。如果你有一些州需要存储,单身是最好的选择。例如,如果您的类需要从属性文件加载某些配置。如果您需要存储某些状态,则可以使用单例。例如,如果您的类需要从属性文件加载一些配置。静态方法不是动态的,这与单例类实例有很大不同。因此,如果需要从类扩展并重写某些方法,第二种方法将不起作用 对于第二种方法,您可能需要使用一些可能导致内存泄漏的静态引用。静态方法不是动态的,这与单例类实例有很大不同。因此,如果需要从类扩展并重写某些方法,第二种方法将不起作用

单例类何时优于只有静态方法和私有默认构造函数的类


请投票。

如果你有一些州需要存储,单身是最好的选择。例如,如果您的类需要从属性文件加载某些配置。

如果您需要存储某些状态,则可以使用单例。例如,如果您的类需要从属性文件加载一些配置。

静态方法不是动态的,这与单例类实例有很大不同。因此,如果需要从类扩展并重写某些方法,第二种方法将不起作用


对于第二种方法,您可能需要使用一些可能导致内存泄漏的静态引用。

静态方法不是动态的,这与单例类实例有很大不同。因此,如果需要从类扩展并重写某些方法,第二种方法将不起作用


对于第二种方法,您可能需要使用一些可能导致内存泄漏的静态引用。

只有静态方法的主要原因是当您只需要一个工具箱来打包一些函数时

我使用单例主要有两个原因:

  • 构造对象确实非常昂贵(时间或内存),而且 我只想做一次
  • 与类关联的数据 在类的每个实例中都需要相同

  • 只有静态方法的主要原因是当您只需要一个工具箱来打包一些函数时

    我使用单例主要有两个原因:

  • 构造对象确实非常昂贵(时间或内存),而且 我只想做一次
  • 与类关联的数据 在类的每个实例中都需要相同

  • 我想说的是,只有在一种情况下才首选单例类:当您有一些系统范围的配置要存储时,很少(如果有)需要刷新

    举个例子,我的一个应用程序中有一个单例模式,它表示用户互联网连接的NAT设备。此应用程序用于桌面,因此很少(如果有)看到internet连接发生变化。假设用户可以将笔记本电脑带到一个新的位置,这将发生变化;但是,有一种方法可以在此事件中重新创建状态,但这是一种非常不常更改的状态,可能需要几秒钟才能初始化

    这需要保持昂贵、不经常变化且全局适用的状态,最好由应用程序范围的bean(我的首选选项)或单例模式bean来完成。静态方法并不能很好地保存这种状态,尽管您也可以使用静态字段来创建伪单例来实现这一点。(不确定是否有更好的名称-可能)


    一般来说,如果可以避免的话,我的建议是不要使用类似于单例的模式,因为这样会增加重用的难度。如果您使用的是CDI框架,请在应用程序级别确定bean的范围,以便于重用。(这可能不是您的问题-如果不是,您可以安全地忽略此建议)

    我想说的是,只有在一种情况下,最好使用单例类:当您要存储一些系统范围的配置时,很少(如果有)需要刷新

    举个例子,我的一个应用程序中有一个单例模式,它表示用户互联网连接的NAT设备。此应用程序用于桌面,因此很少(如果有)看到internet连接发生变化。假设用户可以将笔记本电脑带到一个新的位置,这将发生变化;但是,有一种方法可以在此事件中重新创建状态,但这是一种非常不常更改的状态,可能需要几秒钟才能初始化

    这需要保持昂贵、不经常变化且全局适用的状态,最好由应用程序范围的bean(我的首选选项)或单例模式bean来完成。静态方法并不能很好地保存这种状态,尽管您也可以使用静态字段来创建伪单例来实现这一点。(不确定是否有更好的名称-可能)

    一般来说,如果可以避免的话,我的建议是不要使用类似于单例的模式,因为这样会增加重用的难度。如果您使用的是CDI框架,请在应用程序级别确定bean的范围,以便于重用。(这可能与您无关-如果不是,您可以放心地忽略此建议)

    单例类何时优于只有静态方法和私有默认构造函数的类

    当您需要一个实例时。例如,作为方法参数传递

    单例类何时优于只有静态方法和私有默认构造函数的类


    当您需要一个实例时。例如,要作为方法参数传递。

    请使用单例来更好地控制何时发生初始化。对于静态类,任何初始化都必须在类加载时进行,而您几乎无法控制。例如,对静态最终成员的简单引用将触发类加载。对于单例,初始化可以很容易地推迟到很久以后——通常是第一次使用

    延迟初始化的原因可能是:

    • 它很贵,而且你并不总是需要它来上课
    • 在初始化其他资源(例如,数据库连接)之前,无法进行初始化。在这种情况下,一个延迟实例化的单例通常在没有任何显式控制的情况下提供正确的操作顺序-如果它在其他资源初始化之后才被引用,那么一切都是免费的

    使用单例导入