【问题标题】:Is Java's Runtime class a proper example of a Singleton?Java 的 Runtime 类是单例的适当示例吗?
【发布时间】:2023-03-13 07:55:01
【问题描述】:

我已经阅读了一段时间的单例模式,当我在 Java 语言中搜索单例类时,我发现运行时作为示例,但是当我查看源代码时,我发现了一个非常基本的单例实现:

private static Runtime currentRuntime = new Runtime();
public static Runtime getRuntime() {
    return currentRuntime;
}
private Runtime() {}

而在互联网上有很多关于单例类应该如何的文章。我想知道哪些 Java 语言类最适合作为 Singleton 类示例,为什么?

【问题讨论】:

  • 您认为有可能创建多个此类的实例吗?如果不是,这是一个恰当的例子
  • 有很多方法可以实现单例设计模式。 Runtime 的实现方式只是其中一种方式。
  • 为什么你想知道哪个java类最适合?在单线程应用程序中,相同的事情有不同的方法,不需要同步,在多线程中你需要同步,但如果你想同步方法块等,你可以打电话
  • 小心寻找钉子,因为你有一把锤子。
  • @VedX 我想知道最合适的原因是因为这是人们在面试中经常问的问题,所以我正在寻找一个我可以在不同情况下正确解释和辩护的答案

标签: java design-patterns singleton


【解决方案1】:

是的,这是一个非常基本的单例。它做它应该做的事,没有特别的装饰。

您在互联网上找到的示例通常描述了一个惰性初始化的单例,强调getInstance() 的性能(即避免同步,如果多个线程同时调用getInstance(),则不允许创建多个实例等等第四次)。

如果您不需要延迟初始化,那么创建单例将变得非常简单,正如您在 Runtime 中看到的那样。

最后,您可以找到很多关于单例模式的文章(其中一些具有误导性),但这并不真正保证它的正确性。这不是那么有趣,有些人认为它是一种反模式,如果你发现自己写了很多自己的单例,那么你可能做的不太对。

最后,如果你认为你需要一个延迟初始化的单例,当前的标准实现是enum

public enum MySingleton {
    INSTANCE

    public String getSarcasticMessage() {
        return "I'm a lazy loaded singleton, use me for everything!";
    }
}

MySingleton.INSTANCE.getSarcasticMessage();  // This is how to use it

【讨论】:

  • Runtime 延迟初始化,因为初始化不会在specified initialization triggers之前发生,这是Runtime.getRuntime()在实践中的第一次调用。请注意,这与使 enum 初始化延迟的机制完全相同。唯一的区别是enum 为常量声明了public static final 字段,这增加了通过访问static 字段来触发类初始化的可能性。
  • 枚举是更好的单例,因为你不能通过反射、序列化等来规避单例。
猜你喜欢
  • 2023-03-08
  • 2023-03-11
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 2014-03-10
相关资源
最近更新 更多