You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

删除对象时使用isDestroyed这类布尔标识是否属于最佳实践?

关于是否需要加isDestroyed字段的判断

是否要加这个布尔字段完全取决于你的业务场景,不存在统一的标准答案:

  • 场景1:destroy执行完后,对象还有可能被其他持有它引用的代码调用
    这种情况加isDestroyed属于最优实践,非常有必要。
    比如你的类对外暴露了其他业务方法,一旦对象销毁后还有逻辑调用这些方法,很容易触发空指针、资源访问异常等问题。你可以在所有对外方法的入口处先校验isDestroyed的状态,若为true直接抛出异常或者提前返回,避免无效逻辑执行,提前拦截问题。
  • 场景2:destroy执行完后,不会有任何其他逻辑再访问这个对象,对象很快会被GC回收
    这种情况加这个字段完全是冗余代码,没有任何实际价值,毕竟对象马上就要被回收,字段值根本不会被任何逻辑读取。
额外补充说明

注意你代码注释里写的「移除该Eggplant的所有引用」逻辑是有边界的:类的内部方法没办法清除外部其他地方持有的当前对象引用,你只能在destroy里释放当前对象自身持有的资源(比如打开的文件句柄、网络连接、内部引用的其他大对象),外部的引用需要调用方手动置空,这是Java GC机制决定的。
如果你的Eggplant类会用在对象池这类需要复用的场景里,isDestroyed还可以用来标记对象是否已失效、不允许再被取出复用,这类场景下这个字段也是必须的。

参考代码优化示例:

public class Eggplant {
    private boolean isDestroyed; 
    ... 
    public void destroy(){
       // 释放当前对象持有的所有外部资源、清除内部引用
       isDestroyed = true;
    }

    // 对外业务方法增加状态校验示例
    public void doSomething() {
        if (isDestroyed) {
            throw new IllegalStateException("当前Eggplant对象已销毁,无法执行业务操作");
        }
        // 正常业务逻辑执行
        ...
    }
}

内容的提问来源于stack exchange,提问作者1288Meow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:45:02