为了账号安全,请及时绑定邮箱和手机立即绑定

谨慎使用getter/setter

标签:
Java

在工作中,已经形成了一个习惯,常常在新加一个类时,在写好一些private变量之后,会顺手自动生成相应的getter/setter方法。《Clean Code》中提到

将变量设置为private有一个理由:我们不想其他人依赖这些变量

确认,但是存在很多的规约是将public的变量使用private加getter/setter的方式来呈现,这两种方式都没关系,看个人喜好。

但我们工作中的变量真的都是public的么,很多场景并不是。

第一种是只读变量,这种情况不希望外部可以修改,只能通过配置或者其他的方式来进行初始化。

第二种是纯私有变量,这种情况完全不希望外部依赖。

只有setter的变量比较少见,控制getter/setter的方式主要是方便控制依赖,便于变量的管控。假如有一个订单模型Order,里面有一个Map结构,当bizType的key值为A的时候代表AA业务方的订单,如果把Order的Map暴露出去,就会有很多其他的业务方来根据bizType来判断AA业务订单,如果想要去使用bizType为B来表示AA的业务订单,就需要通知所有使用了Map原始值来判断的业务方来修改,因此,尽量让别人来依赖接口而非实现,而控制getter就是一种较好的途径。

除了依赖管理之外,另外一个好处就是便于阅读,如果我们都是不加思索的添加各种getter方法,就会出现类似ctx.getA().getB()这样的级联调用,除了容易出现NPE之外,还强迫阅读者去理解所有的细节,甚至去跳跃的阅读。如果谨慎的使用getter的话会去强迫自己思考有没有更加抽象的方式来提供服务,让阅读者一目了然。

为了实现策略模式的功能,可以使用多态以及单一处理器的方式来实现,单一处理器要求对象提供getter方法,然后处理器来计算所有逻辑,这种方式的好处是添加方法时在一个类修改就好了。但是我觉得这种优势并不明显,首先是所有的实现类的情况都需要考虑到,代码量并没有减少,其次如果新增了一个实现类,处理器的逻辑容易遗漏,只有在执行阶段才发现问题,而通过多态的方式在编译阶段就可以发现,因此这种情况下也推荐使用多态方式,保持变量的私有化。


webp

多态方式实现,封装变量,隐藏实现


webp

处理器方式实现



作者:真海
链接:https://www.jianshu.com/p/7c93af1bed93


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消