![](/img/trans.png)
[英]Is it necessary for instance methods to access instance variable in 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.