java - 是否需要堆来存储常量(Java 对象)?多少钱?

标签 java constants heap-memory

所以在我的程序中我有很多检查,例如:

return Optional.ofNullable(issuer)
    .orElseThrow(() -> new OAuth2AuthenticationException
        new OAuth2Error(code, description, null));

所以我开始考虑创建一个包含大约 6 个字段的常量类,例如:

public static final OAuth2AuthenticationException ISSUER_IS_NOT_TRUSTED_EXCEPTION =
    new OAuth2AuthenticationException(new OAuth2Error(
        INVALID_ISSUER, "Issuer is not trusted", null));

现在我有类似的东西:

return Optional.ofNullable(issuer)
    .orElseThrow(() -> ISSUER_IS_NOT_TRUSTED_EXCEPTION);

我的问题是:这款游戏值得吗?因为如果每次创建这些对象,它可能会在一段时间内占用更多内存(如果有很多并发用户试图在同一时间非法访问资源),但所有这些对象都会被 GC 销毁。

存储像 6 这样的异常需要多少堆,我应该这样做吗?

最佳答案

请记住:异常只能用于表示异常事物。

如果某件事实际上是异常的,那么它很少发生,因此创建一个新对象的额外成本在所有情况下平均起来基本上为零,即使该对象的构建成本适中。

此外,异常还有堆栈跟踪,它显示抛出异常时的调用堆栈(以及原因、抑制的异常等)。将其存储为常量是没有意义的,除非您(以某种方式)可以保证在具有完全相同的调用堆栈等的同一线程中引发异常。

只需创建一个新对象。

如果您使用此异常来表示并不罕见的事物,那么它并不是真正的异常。使用其他东西来表示这一点。

关于java - 是否需要堆来存储常量(Java 对象)?多少钱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60996250/

相关文章:

c++ - 修剪延迟空闲队列时堆损坏

malloc 中的 C 结构数组

c - C 中涉及常量的算术表达式类型

php - 不能用 $stmt->bind_param() 通过引用传递常量变量?

c++ - const 成员未显式初始化但编译

java - 使用Jlink时如何安装jwdp依赖

java - 无限循环中的堆溢出而不是堆栈溢出

Java 第一次使用按键绑定(bind),按键绑定(bind)事件未在 JPanel 上注册

java - 可以从 Java Servlet API 发送到相对路径的重定向吗?

java - Java中将字符串解析为double时出错