有两种方法:
String salary = company.getPerson(id).getData().getSalary(); String postcode = company.getPerson(id).getData().getPostCode();
或
Data data = company.getPerson(id).getData(); String salary = data.getSalary(); String postcode = data.getPostCode();
哪种方式首选?为什么? 除了可读性之外还有什么好处?
答案 0 :(得分:7)
如果此人不存在,我实际上更喜欢第三种选择
Person person = company.getPerson(id);
if(person != null) {
Data data = person.getData();
if(data != null) {
String salary = data.getSalary();
String postcode = data.getPostCode();
}
}
取决于是否存在空值。如果您可以保证不会有空值,那么您可以消除部分/全部空检查。
正如另一位用户在下面的评论中指出的那样,可能存在这样一种情况:在这种情况下,没有任何方法调用可以返回null,除非性能是一个问题,否则我认为这实际上取决于个人偏好。
我可能仍然希望将它们分成单独的调用,即使没有空检查。
答案 1 :(得分:3)
如果中间变量有可能为null,那么你应该使用第二个选项和空检查
Data data = company.getPerson(id).getData();
if (data != null){
String salary = data.getSalary();
String postcode = data.getPostCode();
// other code here
}
答案 2 :(得分:3)
没有真正的好风格,这取决于背景和需求。
使用:
String salary = company.getPerson(id).getData().getSalary();
String postcode = company.getPerson(id).getData().getPostCode();
如果您需要提高内存使用率。
其他用途:
Data data = company.getPerson(id).getData();
String salary = data.getSalary();
String postcode = data.getPostCode();
如果您想提高效果。
为了便于阅读,这对我来说太主观了。诚实地说,这两者都是可读的。
第二个示例具有折射company.getPerson(id)
的优点,该变量还允许执行某些验证,而无需再次调用company.getPerson(id)
。我经常喜欢这种风格,但是,再次,取决于需求,如果getPersonne(id)
和getData()
无法返回null ,第一种解决方案会更好。
答案 3 :(得分:2)
这取决于你的getter方法的复杂性。例如,如果getPerson(id)方法很复杂,或者/和getData()方法很复杂,那么可能会导致性能问题。
智能编译器可以解决此问题,不包括重复代码部分。但总的来说,从我的观点来看,第二种方式更好。
答案 4 :(得分:1)
对于重构/可读性和性能原因,我个人认为这是最好的解决方案:
Data data = company.getPerson(id).getData();
String salary = data.getSalary();
String postcode = data.getPostCode();
答案 5 :(得分:1)
你必须考虑表现。虽然“漂亮的代码”很棒,但如果有一些昂贵的东西,请保留对它的引用并重用它。
company.getPerson(id)
可能涉及数据库查询以检索数据,因此当第一个选项看起来“整洁”时,第二个选项可能更好。
但答案是“它取决于” - 如果每次通话都很便宜,你可以使用第一个选项。
答案 6 :(得分:1)
要考虑的一件事是getPerson(...)或getData()可能返回null。如果其中任何一个返回null,您将获得NullPointerException奖励,因此答案可能取决于其他隐藏因素,而不仅仅是可读性。
答案 7 :(得分:1)
String salary = company.getPerson(id).getData().getSalary();
String postcode = company.getPerson(id).getData().getPostCode();
此可读性较差,company.getPerson(id).getData()
返回的数据范围仅在运行时返回,因此当时garbage collected
为Data data = company.getPerson(id).getData();
String salary = data.getSalary();
String postcode = data.getPostCode();
。
或
Data
上面的内容更具可读性,但您正在创建另一个garbage collection
类型的引用变量,因此{{1}}收集器将检查堆中“数据”的引用,然后如果发现它符合条件,那么它将收集