代码之家  ›  专栏  ›  技术社区  ›  InverseFalcon

单例异常有效吗?

  •  8
  • InverseFalcon  · 技术社区  · 17 年前

    我的一位同事在工作中介绍了静态工厂方法(直接来自Effective Java),然后给出了一个使用它来获取静态/单例异常的例子。

    这给我敲响了警钟。异常不是有状态的吗?它们不是由JVM填充以获取堆栈跟踪信息吗?既然只有在特殊情况下才会出现例外,那么你真的能节省多少钱呢?

    4 回复  |  直到 17 年前
        1
  •  17
  •   James Schek    17 年前

    Singleton异常应该是一种性能优化。我们的想法是,在创建异常时,可以消除填充堆栈跟踪的成本,这通常是异常中最昂贵的部分。

    April 22, 2003 Tech Tips article 描述了一个重用异常的场景。在这种情况下,他们试图通过减少创建的对象数量来玩弄垃圾收集器。如果你跳过了 populateStackTrace()

    在较新的JVM(我相信是1.4+)中,当在“-server”模式下运行时,JVM可以自动完成这种“优化”。此热点优化可以通过以下选项进行控制 -XX:+OmitStackTraceInFastThrow .

    就我个人而言,我建议不要使用单例异常[反]模式。

        2
  •  3
  •   Randolpho    17 年前

    虽然我完全不同意这种方法,但Singleton Exceptions

        3
  •  1
  •   Paul Sonier    17 年前

    我可以想象这样一种情况,即您希望能够在异常条件中检测到应用程序的另一部分是否已经抛出了异常;我可以看到使用单例异常来实现这种目的;但这似乎有点多余。本质上,它将信号量(“发生了什么”)的概念与异常(“我发生了什么事”)混为一谈。

        4
  •  0
  •   Tom Hawtin - tackline    17 年前

    如果一个“静态工厂方法”不断返回相同的对象,那么它就不是真正的工厂方法。

    java.lang.Throwable 有两个可变状态项:堆栈跟踪和初始原因,直到新版本的Java添加了更多。任何共享 Throwable 将需要违反合同 fillInStackTrace 可抛出的 无法合理地更改消息。

    如果你把它去掉,那么重复使用就没有什么意义了。

    推荐文章