前面几节把属性委托的机制讲完了——getValue/setValue运算符重载、标准库里的lazy/observable/vetoable。这一节回到实战,回答一个更实际的问题:什么时候该自己写一个委托类,以及写了之后怎么落地到项目里。面试里这题被答好的比例不高,原因很直接——大多数人只知道by lazy,一旦要求"用委托把 SharedPreferences 包成属性"就卡住。
先把结论放在前面:属性委托的价值是把"状态的存储与读写策略"从业务代码里抽出来。适用前提有三条:①这个状态有自己的存储位置(SP、DataStore、MMKV、内存、Bundle);②读写前后需要加工(加密、默认值、类型转换、埋点);③同一份读写逻辑要在多处复用。满足两条以上才值得写委托,否则直接写个getter/setter更直白。
机制拆解
委托的编译产物很直白:by关键字会让编译器把属性读写改写成对委托对象的getValue(thisRef, property)/setValue(thisRef, property, value)调用。所以实现委托只需两步——实现ReadWriteProperty<T, V>(或ReadOnlyProperty),把getValue委托给一个"