Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么java.lang.Runtime是单例的?单身要求?_Java_Design Patterns_Singleton - Fatal编程技术网

为什么java.lang.Runtime是单例的?单身要求?

为什么java.lang.Runtime是单例的?单身要求?,java,design-patterns,singleton,Java,Design Patterns,Singleton,我只是想提出开发人员可能需要使用Singleton类的用例。这是:- 当我们需要保持资源之间的同步时。对于 例如,在日志记录的情况下,多个线程需要写入单个线程 按顺序记录文件。这里,单例有助于同步 不同线程之间需要,以便它们在单个文件中写入 按顺序 当对象创建本身是昂贵的,这意味着它需要时间 消费操作。例如:-在以下位置休眠工厂创建: 启动。我不是说每种情况都是这样,而是说 是的,在某些情况下,当需要相同的状态时,单例在这里是有帮助的 跨应用程序和对象创建共享的成本很高 对于业务服务对象,sin

我只是想提出开发人员可能需要使用Singleton类的用例。这是:-

  • 当我们需要保持资源之间的同步时。对于 例如,在日志记录的情况下,多个线程需要写入单个线程 按顺序记录文件。这里,单例有助于同步 不同线程之间需要,以便它们在单个文件中写入 按顺序
  • 当对象创建本身是昂贵的,这意味着它需要时间 消费操作。例如:-在以下位置休眠工厂创建: 启动。我不是说每种情况都是这样,而是说 是的,在某些情况下,当需要相同的状态时,单例在这里是有帮助的 跨应用程序和对象创建共享的成本很高
  • 对于业务服务对象,singleton会提供帮助 迫使我们不能保持物体的状态,而物体的状态又会 代码更好的单元可测试性
  • 我的理解正确吗

    我在寻找jdk中的singleton示例,遇到了运行时类,我想为什么会出现这种singleton?根据我的理解,理由应该是第一位的。例如,我们需要同步,这样两个线程就不会同时运行GC。我的逻辑正确吗

    每个Java应用程序都有一个运行时类实例 允许应用程序与 应用程序正在运行

    直观的感觉是,由于Java程序执行的环境是一个不会改变的静态环境,
    运行时
    是单例的

    即使产生越来越多的线程,处理器的数量、总RAM等也不会改变。因此,使
    运行时
    成为一个单实例可以避免创建一个包含与1000个其他线程相同信息的对象,从而优化程序的执行


    这是我对它的理解。

    单身是邪恶的。它们实际上是伪装的全局变量。对于单元测试来说,它们尤其糟糕,因为一旦单例被类加载器加载,它的行为就被修复了,所以您不能模拟它。您的代码将被修复为永远调用该依赖项

    更好的方法是使用依赖注入将依赖注入到需要的地方,或者通过代码将依赖传递到需要的地方

    阅读:


    你也会问自己,为什么你会想使用单身。一个单例意味着一个实例,但它实际上意味着每个类加载器一个实例。这可能不是你真正想要的解决方案

    在同一个Java进程中实例化一个新的
    运行时
    意味着什么?Singleton类使一个类通常所有内容都是静态的,并将其转换为一个对象。“好处是它现在可以传递到事物中去了。”乔什利看一下我的答案。这不是你的问题所暗示的吗?=)@是的,我的问题是修辞性的,不是静态的。它仍然是对实例的调用,但仅对一个实例进行调用。仍然是实例调用,而不是类上的静态调用。+1但与每个规则一样,都有例外。一个单例适用于运行时,因为整个JVM只能有一个单例。这并不能回答这个问题。看起来像是复制粘贴,不是复制粘贴。我首先质疑使用单例的理由。大多数情况下,你不需要一个单身汉,它带来的问题比它解决的要多。提出的另一点是,单例可以用作某种形式的优化,以防止重复创建昂贵的对象。如果采用依赖注入,这也不是问题。依赖注入并不总是世界上所有问题的唯一解决方案。若运行时不是单例的,并且有人可以在它的位置注入其他东西,那个么它将不会给出正确的结果。依赖注入适用于您的应用程序的测试能力,而不是整个平台。如果你想要一个虚拟的解决方案,你可以构建你自己的IRuntime并在你的应用程序中使用它。你认为你没有抓住要点。在没有DI的情况下通常使用的单例是全局变量,因为它们只能通过全局范围访问。我没说DI是一个银弹解决方案。不过,DI是一个更好的解决方案,因为它将这种依赖性外部化。否则,您就有一个永远不会改变的隐式内部依赖关系。当然,Sun的API是在DI真正起飞之前设计的,所以当时它可能被认为是个好主意。这当然不是目前的良好做法。我是GOOS的实践者,所以将所有合作者外部化是一个更好的设计IMHO。在这种情况下,Runtome可以将所有方法都作为静态方法,而不是单一方法。不是吗?