繁体   English   中英

实例变量上的Java调用方法

[英]Java calling methods on instance variable

有两种方法:

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

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

如果该人不存在,我实际上更喜欢第三种选择

Person person = company.getPerson(id);
if(person != null) {
    Data data = person.getData();
    if(data != null) {
        String salary = data.getSalary();
        String postcode = data.getPostCode();
    }
}

这取决于是否可能存在空值。 如果您可以保证不会有空值,那么您可以消除部分/全部空检查。

正如另一位用户在下面的评论中指出的那样,可能存在这样的情况:在这种情况下,没有任何方法调用可以返回null,除非性能是一个问题,否则在我看来它真的会归结为个人偏好。

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

如果中间变量有可能为null,则应使用第二个选项和空检查

Data data = company.getPerson(id).getData();    
if (data != null){
    String salary = data.getSalary();     
    String postcode = data.getPostCode();
    // other code here
}

没有真正的好风格,这取决于背景和您的需求。

采用 :

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

如果你想提高性能

为了便于阅读,这对我来说太主观了。 诚实地说,这两者都是可读的。

第二个例子具有refractoring company.getPerson(id)的优点,变量也允许执行一些验证而无需再次调用company.getPerson(id) 我经常喜欢这种风格,但是,再次, 根据需要,如果getPersonne(id)getData()不能返回null,第一个解决方案可能会更好

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

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

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

Data data = company.getPerson(id).getData();    
String salary = data.getSalary();     
String postcode = data.getPostCode();

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

company.getPerson(id)可能涉及数据库查询以检索数据,因此当第一个选项看起来“整洁”时,第二个选项可能更好。

但答案是“它取决于” - 如果每个电话都很便宜,你可以使用第一个选项。

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

 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器,将检查堆中“数据”的引用,如果发现它符合条件,则会收集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM