Java中重复访问对象字段值的最佳实践及场景方案对比
先看你给出的类定义:
public class Book { private Author author; private int pageCount; // ... getters and setters }
public class Author { private String name; private int age; // ... getters and setters }
针对重复访问某本书的作者名称的场景,最佳选择是doSomethingC,原因如下:
先看doSomethingA的问题:
这个方法里重复调用book.getAuthor().getName(),如果getAuthor()或者getName()不是简单的字段返回(比如包含懒加载、计算逻辑、日志输出),每次调用都会重复执行这些逻辑,造成不必要的性能损耗。另外如果book.getAuthor()返回null,两次调用都会抛出空指针异常,调试时还得排查两次调用的问题,反而麻烦。而且代码重复,看起来也不够简洁。再看doSomethingB:
它把Author对象缓存下来,减少了book.getAuthor()的调用次数,但还是重复调用author.getName()。如果getName()有复杂逻辑(比如从数据库动态获取、字符串拼接处理),同样会重复执行。而且如果author是null,两次调用getName()还是会抛异常,虽然比A好一点,但没解决根本问题。最后看doSomethingC:
它直接把最终需要的作者名称缓存到局部变量里,只调用一次book.getAuthor()和一次getName()。不管这两个getter方法里有没有额外逻辑,都只会执行一次,性能最优。而且如果出现null的情况,只会在获取authorName的时候抛出一次异常,方便定位问题。代码上也更清晰,重复使用变量比重复调用嵌套方法可读性更强,后续如果要修改作者名称的使用逻辑,直接改变量相关的代码就行,维护成本更低。
总的来说,重复访问同一个对象的字段值时,最好把最终需要的结果缓存到局部变量里,既提升性能,又让代码更易读、易维护。
内容的提问来源于stack exchange,提问作者mHasan

