MVVM结合Clean架构的Android项目,全局复用变量存哪更优?
方案对比:Repository私有变量注入 vs 静态全局字段
毫无疑问,在LocationRepository中定义私有变量存储最后位置并提供公共getter,再通过依赖注入将Repository注入到所需ViewModel的方案,在可测试性和单一职责原则上都远优于静态全局字段的方案,原因如下:
单一职责原则层面
- LocationRepository的核心职责就是管理设备位置数据的获取、存储与提供,将lastLocation作为其内部私有变量维护,完全符合单一职责——所有和位置状态相关的逻辑都收敛在Repository中,职责清晰。
- 静态全局字段的方式相当于把位置状态变成了不受控的全局共享变量,打破了封装:任何地方都能直接修改(如果没做限制的话),状态维护逻辑分散,后续要修改位置存储规则(比如加入本地缓存、切换位置数据源)时,所有依赖静态字段的地方都要改动,耦合度极高。
可测试性层面
- 依赖注入的方案可以轻松实现测试隔离:测试ViewModel时,你可以通过Mock框架(如MockK)创建一个模拟的LocationRepository,返回预设的lastLocation值,不需要依赖真实的设备位置服务或全局状态,测试用例之间完全独立,结果稳定。
- 静态全局字段的测试难度极大:静态字段的状态会在测试用例之间残留,比如前一个测试修改了静态值,下一个测试的结果就会被干扰,必须在每个测试前后手动重置状态,不仅繁琐,还容易遗漏导致测试失败。
代码示例参考
LocationRepository实现
class LocationRepository { private var lastLocation: Location? = null // 对外提供获取最后位置的方法 fun getLastLocation(): Location? = lastLocation // 示例:从系统获取位置并更新内部存储 suspend fun refreshLastLocation() { val fetchedLocation = // 调用系统位置API或其他数据源获取位置 lastLocation = fetchedLocation } }
ViewModel注入使用
// 以Hilt依赖注入为例 class HomeViewModel @Inject constructor( private val locationRepository: LocationRepository ) : ViewModel() { val currentLastLocation get() = locationRepository.getLastLocation() }
内容的提问来源于stack exchange,提问作者berchoes
相关产品推荐
相关产品推荐

