【问题标题】:Does it make sense to set session=null after session.close()?在 session.close() 之后设置 session=null 有意义吗?
【发布时间】:2018-09-04 15:58:58
【问题描述】:

考虑一下这段代码:

public void foo(){
       try{
        //some cool statements here
      }
      finally {
         if(session != null){
             session.close();
             sesssion = null;
          }
     }
   }

由于会话已关闭,分配给会话的值是否有意义?请提供一些有价值的见解。

【问题讨论】:

  • 一般没用。可以告诉 GC session 已准备好被收集,但您无法控制 GC。此外,如果您的方法在 finally 块会话之后结束,无论如何将是 null
  • 在 Java 中是否存在像“会话删除竞争条件”这样的情况,将其设置为 null 可能会有所帮助? developer.joomla.org/news/…

标签: java session connection httpsession


【解决方案1】:

将局部变量设置为 null 是不必要的,也就是说,它是 CERT Oracle 安全编码标准 Recommendations 的一部分

没有必要将局部引用变量设置为 null 以“帮助垃圾收集器”。它增加了代码的混乱,并可能使维护变得困难。 Java 即时编译器 (JIT) 可以执行等效的活性分析,并且大多数实现都这样做。

【讨论】:

    【解决方案2】:

    在对象本身变得无用的情况下(在此示例中为关闭会话),将变量设置为 null 可能很有用。此类对象通常记录在调用close 或类似方法后,对该对象的所有进一步操作都将失败,例如通过投掷IllegalStateException。在这些情况下,删除这样的实例可以说是有意义的,特别是如果代码的其他部分期望并检查空实例作为“无连接”的标志。

    如其他答案所述,垃圾收集并不是将变量设置为 null 的正当理由。

    【讨论】:

    • 是的,对于这种情况,检查空实例有点意义,但从技术上讲,它是否还有其他具体意义?
    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    相关资源
    最近更新 更多