4

有两种方法:

 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();

哪个是首选方式,为什么?除了可读性之外还有什么好处吗?

4

8 回答 8

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 在这种情况下,除非性能是一个问题,否则在我看来这真的取决于个人喜好。

即使没有空检查,我可能仍然希望像我一样将它们分成单独的调用。

于 2012-07-11T12:03:31.780 回答
3

如果中间变量有可能为空,那么您应该使用第二个选项以及空检查

Data data = company.getPerson(id).getData();    
if (data != null){
    String salary = data.getSalary();     
    String postcode = data.getPostCode();
    // other code here
}
于 2012-07-11T12:00:45.030 回答
2

这取决于您的 getter 方法的复杂性。例如,如果 getPerson(id) 方法很复杂,或者/和 getData() 方法很复杂,那么它可能会导致性能问题。

智能编译器可以克服这个问题,但不包括重复的代码部分。但总的来说,从我的角度来看,第二种方式更好。

于 2012-07-11T12:02:56.243 回答
2

没有真正好的风格,这取决于上下文和您的需求。

采用 :

 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 ,第一个解决方案可能会更好。

于 2012-07-11T12:11:30.047 回答
1

出于重构/可读性和性能原因,我个人认为这是最好的解决方案:

Data data = company.getPerson(id).getData();    
String salary = data.getSalary();     
String postcode = data.getPostCode();
于 2012-07-11T12:00:55.497 回答
1

你必须考虑性能。虽然“漂亮的代码”很棒,但如果有一些昂贵的东西,请保留对它的引用并重用它。

很可能company.getPerson(id)涉及到数据库查询来检索数据,所以虽然第一个选项看起来“更整洁”,但第二个选项可能更好。

但答案是“视情况而定”——如果每次通话都很便宜,您可以使用第一个选项。

于 2012-07-11T12:02:21.793 回答
1

需要考虑的一件事是 getPerson(...) 或 getData() 可能返回 null 的情况。如果其中任何一个返回 null,您将获得 NullPointerException 奖励,因此答案可能取决于其他隐藏因素,而不仅仅是可读性。

于 2012-07-11T12:03:39.810 回答
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 收集器将检查堆中“数据”的引用,然后如果发现它符合条件,那么它将收集。

于 2012-07-11T12:03:47.987 回答