一个困扰了很久的问题 希望得到指点

public class TestOne {
private TestBean bean;
private BeanManager manager;
public TestOne(TestBean bean){
this.bean=bean;
}
public String queryData(){
manager.doSome(bean);
}
}
___________________________________________
public class TestTwo{
private BeanManager manager;

public String queryData(Test bean){
manager.doSome(bean);
}
}
___________________________________________

这两种编写代码的方式经常可以见到,特别是在写服务类时一个DAO对一个VO的操作,那么这两种写法有什么区别,哪种更适合,还是各自有不同的适用场合?
[该贴被frogoo于2007-10-30 17:41修改过]
[该贴被frogoo于2007-10-30 17:43修改过]

这本质上要掌握对象的生命周期。

在Java编程中,我们制造使用一个对象时,一定要心里对其生命周期有一个掌握,这是传统过程语言所没有的习惯。

TestBean如果作为TestOne的字段属性,那么TestBean生命周期就和TestOne一致。采取第二种方式就没有这个考量。

还有进一步:如果两者生命周期是一致的,也就是说两者形成依赖度更高的关联,那么耦合性就更强(除非我们使用依赖注射模式),而设计目标是松耦合。

public class TestOne {
private TestBean bean;
private BeanManager manager;
public TestOne(TestBean bean){
this.bean=bean;
}
public String queryData(){
manager.doSome(bean);
}
public void saveData(){
manager.doSava(bean);
}
}
___________________________________________
public class TestTwo{
private BeanManager manager;

public String queryData(TestBean bean){
manager.doSome(bean);
}
public void doOthers(){
System.out.println("other");
}
}

您所说的“TestBean生命周期和TestOne一致”的意思是什么? 是指TestBean贯穿于TestOne的所有方法,TestOne的操作都要依赖于TestBean吗?
是不是 像TestTwo一样 当TestBean只是TestTwo职能的一部分的时候,使用第二种方式

第一种方式,testbean在testone成为实例时候已经成为实例,除非写setter来改变,否则直到testone销毁都存在
而第二方式中,testbean和testtwo没有实例上的关系,仅作为参数参与运算

>TestBean生命周期和TestOne一致
就是生死与共啦,同生同死。

>TestBean生命周期和TestOne一致
就是生死与共啦,同生同死。


两种方式(通过构造方式或参数)应该是相同的生命周期。都是外部对象引用传到TestOne。TestOne ,TestTwo被回收时,TestBean对象可能还被引用着。TestBean生命周期和TestOne是不一致的才对。
我的理解请指点下,谢谢

首先是设定范围,现在范围只在TestBean和TestOne内。

首先要注意java特点:只要对象不被引用,就会被回收。

第一种方式:引用TestBean;

也就是TestBean至少有一个TestOne引用它,只要TestOne不被回收,TestBean都不会被回收,所以说生命周期一样。

第二种方式:没有引用。

只要引用TestBean的对象都被回收了,TestBean就会被回收,TestOne没有引用TestBean,所以TestOne有没有被回收都与TestBean无关。

其实可以这样理解:“孩子”有“父母”“保护”的才不会被“杀掉”。“孩子”-被引用对象,“父母”-引用对象,“保护”-引用,“杀掉”-回收。(不考虑孩子和父母的寿命问题)