【发布时间】:2020-10-24 22:48:43
【问题描述】:
我正在使用 Dagger2 和 Hilt 学习 DI,我有一个问题: 在创建 android 应用程序时,我注意到我使用了许多带有静态方法的实用程序类(即一个以摄氏温度接收温度并以华氏温度返回它的函数)。但是,我也使用一个带有静态实用程序方法的类(比如 NetworkUtils)来执行网络调用以从 API 获取数据(就像 Android Nanodegree 课程的讲师所做的那样): 我做的是这样的:
class NetworkUtils{
public static String fetchCityName(double latitude, double longitude){
// code for API call
}
}
现在,当我从 Developer Docs 中学习 DI 原理时,我注意到网络调用是在实例方法内的实例类中进行的,并且它的参数是使用 Dagger 注入的。
- 为什么这与我所做的不同? 我读到静态方法使测试变得不容易,但是,假设我像文档显示的那样使用 DI,
- 为什么我必须实例化一个新的 NetworkUtils 对象,当我需要执行 API 调用时,而创建多个实例是无用的? 此外,官方文档说我们使用@Singleton 注解来设置函数范围(即对于 REST API 调用函数)应该是非常少见的,那么:
- 我是否应该为我需要使用的所有东西创建实例,即使它不需要? (昂贵的对象实例化除外)
- 最后,能否请您澄清一下实用程序类和我不应该在其中使用静态方法的普通类之间的区别?
谢谢。
【问题讨论】:
-
这是一个非常广泛的问题,没有明确的答案。如果一个类是无状态的,那么注入它是没有意义的,因为所有实例都是平等的。 [我有理由期望像 NetworkUtils 这样的类有一些字段来指定要调用的后端等。考虑到您在此处显示的方法,它甚至可以是一个接口。]
标签: android dependency-injection dagger-2 dagger dagger-hilt