写了类似下面的代码,老大说以后不准写这样的代码,小弟费解,求指教
代码情况(简写,意思已表达):
public static void main(String[] args) { Student stu = new Student(); //stu.xxx Student stu2 = new CodeStyle().getStudent(stu); } private Student getStudent(Student stu) { // xx ----- stu.setId(1); stu.setName("student"); return stu; }
即 目的是:调用getStudent()方法,在方法中对参数stu进行一些处理,最后得到一个Student对象返回
不过我的方式是在调用getStudent()方法前new一个对象,引用传递到getStudent()方法中对其进行处理
老大说这样写部署在分布式应用中会挂掉
他意思是 这样的代码应该在getStudent()方法里new一个Student对象,处理后在返回
类似上面的对象引用传递,处理,再返回会挂掉。
额 具体原因不知为何? 为何在那样的环境会挂掉?
求解, 谢谢了!(新手,分很少,谅解啊各位兄台)
你能写出这样的代码,也不容易,短短的一个方法,犯了不少错误。
1. 以对象作为参数传递给方法,方法内最好不要修改对象,否则程序出错的时候很难找到是在哪儿被修改。
2. 把参数对象作为返回值,这样就是两个引用指向同一个对象,容易引起内存泄露,对象无法被垃圾回收器清除。
3. Student stu2 = new CodeStyle().getStudent(stu);
这也很糟糕,CodeStyle被创建出来,只是为了创建另一个对象,如果是这样,就应该把getStu方法设置成静态的。
我的理解是这样的:
你调用这个方法的时候getStudent(Student stu) 传进来是一个对象的引用,此时在栈空间中多了一个地址,也是指向stu,那现在就有两个相同的地址指向stu了。在getStudent方法内对stu进行了操作,就影响到getStudent方法外面声明的同一个stu对象的值。
就存在了两个地方都可以更改一个对象了。
public static void main(String[] args) {
Student stu = new Student();
//stu.xxx
new CodeStyle().getStudent(stu);
}
private void getStudent(Student stu) {
// xx -----
stu.setId(1);
stu.setName("student");
}
这样行不行?
你的目的是改stu的值吧..如一楼所说...
如果不是的话..就要做深度clone..
你老大的意思是
[code="java"]
private Student getStudent() {
Student stu = new Student();
stu.setId(1);
stu.setName("student");
return stu;
}
[/code]
应用会挂掉,可能是从垃圾回收角度看的,也就是内存溢出(你创建的对象没有被回收)。
在看上面的getStudent方法,当调用该方法时,stu变量的作用域只在该方法期间存在,
一旦该方法返回,则在这个方法内创建的对象就符合垃圾回收条件,可以被回收掉。
第一 : [color=red]部署在分布式环境中会挂掉?[/color] 8)
第二 : 为嘛不用deepclone