我想了解以下编码习惯是好还是坏。
我将一个Value Object作为参数传递给方法,并且被调用的方法返回相同的参数Value Object。我特别认为,因为它引用了相同的对象,所以我们不需要将它作为返回类型。
Class A
{
initStudent()
{
Student studentObj = new Student();
//do some processing
studentObj = processStudent(studentObj);
}
processStudent(Student pObj)
{
//do something
return pObj;
}
}
答案 0 :(得分:3)
有时需要获取参数并返回相同类型的参数,即使由于某些原因操作在参数上也是如此:
1。如果对象是不可变的(即字符串)
2。如果对象实际可以更改(一个很好的例子是<T>[] List.toArray(<T>[])
,如果参数数组中没有足够的空间,则创建一个新的,否则,数组写在参数上)
3。它还隐式告诉用户可能会更改值...
4。如果需要,不要害怕这样做,很多项目都使用它(即Apache Lucene)
答案 1 :(得分:1)
是的,你不应该归还它。正确使用访问修饰符和返回类型。
public class A
{
public Student initStudent()
{
Student studentObj = new Student();
//do some processing
processStudent(studentObj);
return studentObj;
}
private processStudent(Student pObj)
{
//do something
}
}
答案 2 :(得分:1)
确实你不需要归还物体。什么也不回报。
Class A
{
void initStudent()
{
Student studentObj = new Student();
//do some processing
processStudent(studentObj);
}
private void processStudent(Student pObj)
{
//do something
}
}
编辑:另外,正如adarshr指出的那样,如果没有&#34;出去&#34;你创建的Student对象将毫无用处。 initStudent()
方法。可能您可能想要返回它,或将其存储在Collection实例字段中。
答案 3 :(得分:1)
我认为如果方法修改它,返回对象是一个好习惯。因此,该方法的签名清楚地表明该对象被修改,并且您没有隐含的副作用。
如果该方法不是为了修改对象,则不应该返回它。
答案 4 :(得分:0)
如何将studentObj设置为成员变量,因为它是同一个类
编辑:我想processStudent会在Student上调用一些方法,称为feature envy - 该方法'希望在Student中'。这不是一个好习惯,而是通过创建新方法
在Student类中创建处理答案 5 :(得分:0)
我宁愿瞄准依赖注入并结合decorator design pattern
在主要代码中,我将处理学生初始化并传递它以进行装饰
studentObj = new Student();
decoratedStudentObj = new A(studentObj);
finalStudentObj = decoratedStudentObj.getStudent()
这将触发所有不同类中的getStudent()方法并修改casacade中的所有学生对象。
所以你最终可能会得到这样的结果:
studentObj = new Student();
decoratedStudentObj = new A(studentObj);
decoratedStudentObj = new A(decoratedStudentObj );
decoratedStudentObj = new B(decoratedStudentObj);
decoratedStudentObj = new C(decoratedStudentObj );
finalStudentObj = decoratedStudentObj.getStudent()
依赖注入的另一个优点是允许您定义不同的学生类型,只要所有学生对象实现相同的接口/方法集,您就必须复制任何代码
IE:
studentObj = new Student()
decoratedStudentObj = new A(studentObj);
finalStudentObj = decoratedStudentObj.getStudent()
highSchoolStudentObj = new HighSchoolStudent()
decoratedHighSchoolStudentObj = new A(highSchoolStudentObj);
decoratedHighSchoolStudentObj = new B(decoratedHighSchoolStudentObj );
finalHighSchoolStudentObj = decoratedHighSchoolStudentObj .getStudent()
collegeStudentObj = new CollegeStudent()
decoratedCollegeStudentObj = new A(collegeStudentObj );
decoratedCollegeStudentObj = new C(decoratedCollegeStudentObj);
finalCollegeStudentObj = decoratedCollegeStudentObj.getStudent()
最后,它更容易实现UnitTesting,因为您可以轻松地模拟学生类以独立地测试您的处理类。