代码这样写有问题吗,求解

写了类似下面的代码,老大说以后不准写这样的代码,小弟费解,求指教

 

代码情况(简写,意思已表达):

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对象,处理后在返回

类似上面的对象引用传递,处理,再返回会挂掉。

 

额 具体原因不知为何? 为何在那样的环境会挂掉?

 

求解, 谢谢了!(新手,分很少,谅解啊各位兄台)

 

 

 

 

 

 

 

 

6个回答

你能写出这样的代码,也不容易,短短的一个方法,犯了不少错误。
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

立即提问