删除对象时使用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
相关产品推荐
相关产品推荐

