参数中给定引用的对象的Java生存期
假设我有代码:参数中给定引用的对象的Java生存期,java,object,scope,lifetime,Java,Object,Scope,Lifetime,假设我有代码: class Foobar { Object item = null; ItemInstantiator inst = new ItemInstantiator(); public instantiateItem() { inst.instantiate(item); } } class ItemInstantiator { public instant
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;
}
}
《干净的代码-敏捷软件工艺手册》一书指出,在一般情况下,应该避免输出参数。如果您的函数必须更改某个对象的状态,请让它更改其所属对象的状态。
请重新考虑类设计,通过传递引用实例化对象是否真的有意义。根据你的代码,它没有任何意义。您只需创建对象,而无需传递任何参数
项您正在方法中实例化对象,而不返回其引用
你应该换成
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;
}
}
《干净的代码-敏捷软件工艺手册》一书指出,在一般情况下,应该避免输出参数。如果您的函数必须更改某个对象的状态,请让它更改其所属对象的状态。
请重新考虑类设计,通过传递引用实例化对象是否真的有意义。根据你的代码,它没有任何意义。您可以在不传递任何参数的情况下创建对象item
Java是按值传递的,因此您不能像尝试那样修改item
参数的值。如果item
包含对某个对象的非空引用,如果该对象是可变的,则可以修改该对象,但不能从items实例化器#实例化()
中影响Foobar
中item
的值。如果这似乎不清楚,请阅读。这与对象生命周期无关。您创建了一个新对象,并立即将其丢弃。Java是按值传递的,因此您无法像尝试那样修改项
参数的值。如果item
包含对某个对象的非空引用,如果该对象是可变的,则可以修改该对象,但不能从items实例化器#实例化()
中影响Foobar
中item
的值。如果这似乎不清楚,请阅读。这与对象生命周期无关。您创建了一个新对象,并立即将其丢弃。感谢您的良好响应。我这样做的原因是递归地创建一个链表类型的结构,方法是实例化一个列表元素,将上一个元素的指针赋给它,然后传递新元素的指针,以便在下一个递归中分配它。另外,我一直在使用返回语句来处理错误代码。好的,您应该选择在单个类中执行此操作。这将在功能上更加具体。另外,尝试使用异常处理而不是错误代码。这将使您的代码更加复杂。这正是我的观点。谢谢你的回复。我这样做的原因是递归地创建一个链表类型的结构,方法是实例化一个列表元素,将上一个元素的指针赋给它,然后传递新元素的指针,以便在下一个递归中分配它。另外,我一直在使用返回语句来处理错误代码。好的,您应该选择在单个类中执行此操作。这将在功能上更加具体。另外,尝试使用异常处理而不是错误代码。这将使您的代码更加复杂。这正是我的观点。