弱引用应传入方法还是在方法内创建?哪种方案更优?
毫无疑问,我会更倾向于第二种实现方式 public void register(Listener listener) { mListener = new WeakReference<Listener>(listener); },核心原因围绕封装性、易用性和代码健壮性这几点:
简化调用方的使用成本
调用方只需要传入Listener的实例即可,完全不用关心内部是用弱引用持有这个实例的。对比第一种实现,调用方还得手动创建WeakReference对象,不仅多写了冗余代码,还增加了理解门槛——如果调用方不熟悉弱引用的作用,可能会疑惑为什么要传这个包装类。封装内部实现细节
把弱引用的创建逻辑封装在类内部,符合面向对象的封装原则。后续如果需要调整持有方式(比如改成软引用,或者增加额外的持有校验逻辑),只需要修改这个register方法内部,调用方的代码完全不需要改动,大幅降低了模块间的耦合度。减少潜在的错误风险
如果用第一种实现,调用方可能会不小心传入一个已经被回收的WeakReference,或者重复传入同一个弱引用实例导致意外的生命周期问题。而第二种实现由类自己创建弱引用,能更好地控制这个引用的生命周期,避免这类由调用方操作不当带来的错误。代码可读性更优
第二种方法的签名register(Listener listener)一眼就能看懂是注册一个监听器,语义非常清晰。而第一种方法的签名register(WeakReference<Listener> listener)会让阅读代码的人困惑:为什么要传弱引用?是不是有特殊的使用约定?增加了不必要的理解成本。
当然,也存在极少数特殊场景可能需要第一种实现——比如调用方确实需要自己管理这个弱引用的生命周期,或者要复用同一个弱引用实例,但这类场景非常罕见,绝大多数业务场景下第二种实现都是更合理的选择。
内容的提问来源于stack exchange,提问作者Binary Baba

