¿Puedo saber la diferencia entre @Singleton VS static proporciona en dagger2?

@Provides static User currentUser(AuthManager authManager) {
    return authManager.currentUser();
}

@Provides @Singleton User currentUser(AuthManager authManager) {
    return authManager.currentUser();
}
21
Shawn Thye 13 ago. 2016 a las 17:10

2 respuestas

La mejor respuesta

Estos son atributos muy diferentes y puede tener uno u otro de forma independiente. Todos estos son válidos:

@Provides User currentUser(...) {}
@Provides static User currentUser(...) {}
@Provides @Singleton User currentUser(...) {}
@Provides @Singleton static User currentUser(...) {}

Para preparar el escenario, un método @Provides User dice "para este componente o sus dependencias, llame a este método @Provides cada vez que necesite un usuario". Normalmente, el método devolverá una nueva instancia cada vez, y Dagger no guardará ni almacenará en caché la instancia.

@Singleton es un ejemplo de alcance , que es una forma elegante de decir política de ciclo de vida o política sobre la frecuencia con la que se crea una nueva instancia . @Provides @Singleton User dice "para este componente o dependencias, simplemente llame a este método @Provides una vez y guarde el resultado". @Singleton resulta ser un caso común integrado, pero también puedes imaginar la creación de un @UserScope (siempre devuelve la misma instancia para este usuario), o en Android un @FragmentScope o @ActivityScope.

Para su caso específico, probablemente no desee @Singleton, porque le indicaría a su componente que guarde o caché el valor de AuthManager. Si el valor de Usuario puede cambiar a lo largo de la vida de su aplicación, el Componente no lo reflejaría. (En ese caso, también querrá asegurarse de inyectar Provider<User>, que se actualizaría, en lugar de User que no lo haría).

Dejando atrás los alcances por un momento, static se comporta exactamente como lo esperarías en Java: si un método no requiere ningún estado de instancia, puedes hacerlo static, y tu máquina virtual puede llámelo sin preparar ningún estado de instancia. En la implementación de su Componente generado, Dagger llamará automáticamente a los métodos static de forma estática, y los métodos de instancia en la instancia del Módulo que usted pasa a su Componente; en Android, esto se traduce en un aumento considerable del rendimiento. Debido a que no usa ningún estado de instancia en su método currentUser, se puede hacer fácilmente static.

Lectura adicional:

36
Community 23 may. 2017 a las 12:02

Con la anotación @Singleton, solo se creará una instancia del objeto Usuario a lo largo del ciclo de vida de la aplicación.

static en @Provides métodos introducidos recientemente para hacer que la invocación del método sea más rápida entre un 15 y un 20% como se menciona aquí. Habrá varias instancias del objeto Usuario si llamamos a este método varias veces.

3
David Liu 24 oct. 2017 a las 21:08