case1,case2和case3之间有什么区别吗?是否有与绩效相关的优势或劣势?
public class Test {
private String name;
public void action (){
name = doSome(); // case 1
setName(doSome()); // case2
this.name =doSome(); // case3
}
public String doSome(){
return "Hello";
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
}
答案 0 :(得分:3)
使用Eclipse上的调试和断点来查看每个案例采取的步骤数。越少越好。
Case 1
迈出了一步
Case 2
采取了两个步骤
Case 3
=与Case 1
相同
Case 1
与Case 3
相同,this
关键字仅指当前的类。
答案 1 :(得分:3)
我想,在第2种情况下,我们在堆栈上放了一个额外的方法,即setName.But从性能的角度来看,增益几乎可以忽略不计。所以根据我的说法,在这个例子中,我们应该从代码维护中思考和可读性的观点而不是表现。
答案 2 :(得分:0)
案例1和3将生成相同的代码(除非它们是不同的“名称”)。第二个将有一个额外的函数调用,可能会或可能不会被JIT优化。但是,这不是你应该注意的缺点。
答案 3 :(得分:0)
我更喜欢案例2,因为在案例1中,如果将来某个时候引入了局部变量name
,则会导致读取代码的人对其引用的变量产生混淆。
在案例3中,虽然范围更清楚,但是不使用setter的事实意味着如果将来某个时候你改变了name字段的设置方式(例如:你想修剪空格),你必须改变所有修改名称变量的代码,如果你在任何地方使用了case 2,你只需要更新setter方法。
在我看来,健康的企业软件开发应该不断重构代码,因为发现了错误并且业务需求不断变化,因此案例2将在这里给您带来优势。但如果这只是一个大学的家庭作业,那么你将逃脱案例1& 3。
性能方面的案例1& 3似乎消耗较少的函数调用,但它是否会给你带来显着改进我不知道。
另外请记住,Eclipse等大多数流行的IDE只需点击几下鼠标按钮即可为您自动生成getter和setter - 这应该回答“getters& setters在Java中是如此麻烦。” “