实例变量上的Java调用方法

时间:2012-07-11 11:57:21

标签: java coding-style

有两种方法:

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

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

8 个答案:

答案 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 collectedData data = company.getPerson(id).getData(); String salary = data.getSalary(); String postcode = data.getPostCode();

Data

上面的内容更具可读性,但您正在创建另一个garbage collection类型的引用变量,因此{{1}}收集器将检查堆中“数据”的引用,然后如果发现它符合条件,那么它将收集