从参数给定引用的对象的 Java 生命周期

标签 java object scope lifetime

假设我有代码:

    class Foobar {
        Object item = null;
        ItemInstantiator inst = new ItemInstantiator();
        public instantiateItem() {
            inst.instantiate(item);
        }
    }

    class ItemInstantiator {
        public instantiate(Object item) {
            item = new Object();
        }
    }

由于 Foobar 类具有对 instantiate() 中创建的新对象的实时引用,因此在 instantiate() 完成后该新对象不应该被垃圾回收,对吗?

我问这个问题是因为我正在开发一个项目,在一个类中声明一个对象并在另一个类的方法中实例化该对象是最有意义的。问题是,一旦实例化完成,该对象仍然为空。

最佳答案

您正在方法中实例化对象,并且返回其引用

您应该更改为

class Foobar {
        Object item = null;
        ItemInstantiator inst = new ItemInstantiator();
        public instantiateItem() {
           item = inst.instantiate(item);
        }
    }

    class ItemInstantiator {
        public Object  instantiate(Object item) {
            item = new Object();
            return item;
        }
    }

《Clean Code - A Handbook of Agile Software Craftmanship》一书指出,一般情况下应该避免输出参数。如果您的函数必须更改某些对象的状态,请让它更改其所属对象的状态。

请重新思考类的设计,通过传递引用来实例化对象是否真的有意义。根据您的代码,它没有任何意义。您可以只创建对象而不传递任何参数 item

关于从参数给定引用的对象的 Java 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35910222/

相关文章:

java - Hashmap值转换错误

java - Java 中的 if( boolean 条件)

javascript - lodash 中的多个版本的 keyBy? (组值共享一个键作为一个数组)

javascript - 是否可以从 JavaScript 中的对象数组中获取特定属性?

variables - Lua 函数选择局部变量而不是全局变量

java - 如何确保使用 Google Dagger 2 释放资源

java - 如何在多模块项目中配置 Maven shade 插件?

java - 我如何使用 isElementPresent(By by) 方法来验证我的测试脚本是否正常工作?

delphi - Delphi 2009 和旧式对象类型的问题

java - 为什么我不能从 Java 中的内部 Thread 类访问外部类?