StackOverflowError utilizando Singleton en Kotlin
¿Puede alguien decir, ¿por qué estoy recibiendo un java.lang.StackOverflowError
utilizando esta clase Kotlin? La línea 41 es if (instance == null) {
class TokenHelper protected constructor() { var token: String? = null var appId: String? = null var installationId: String? = null var userId: String? = null companion object { var instance: TokenHelper? = null get() { if (instance == null) { instance = TokenHelper() } return instance } } }
Stacktrace:
- Error: Error en la ejecución de la tarea ': app: clean'. No se puede eliminar el archivo
- Diseño sintético y personalizado de Kotlin en DialogFragment
- Problemas al intentar generar aplicaciones de Kotlin con Android Studio
- No se pueden resolver los métodos de registro de Anko
- Extensiones y fragmentos de Android de Kotlin
04-11 19:07:42.188 16142-16142/com.foo.bar.debug E/AndroidRuntime: FATAL EXCEPTION: main Process: com.foo.bar.debug, PID: 16142 java.lang.StackOverflowError: stack size 8MB at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:0) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41 04-11 19:07:42.271 16142-16142/com.foo.bar.debug D/Error: ERR: exClass=java.lang.StackOverflowError 04-11 19:07:42.271 16142-16142/com.foo.bar.debug D/Error: ERR: exMsg=stack size 8MB 04-11 19:07:42.271 16142-16142/com.foo.bar.debug D/Error: ERR: file=TokenHelper.kt 04-11 19:07:42.271 16142-16142/com.foo.bar.debug D/Error: ERR: class=com.foo.bar.helper.TokenHelper$Companion 04-11 19:07:42.271 16142-16142/com.foo.bar.debug D/Error: ERR: method=getInstance line=0 04-11 19:07:42.282 16142-16142/com.foo.bar.debug D/Error: ERR: stack=java.lang.StackOverflowError: stack size 8MB at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:0) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) at com.foo.bar.helper.TokenHelper$Companion.getInstance( 04-11 19:07:42.283 16142-16142/com.foo.bar.debug D/Error: ERR: TOTAL BYTES WRITTEN: 880768 04-11 19:07:45.527 16142-16142/com.foo.bar.debug D/Process: killProcess, pid=16142 04-11 19:07:45.528 16142-16142/com.foo.bar.debug D/Process: com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException:113 java.lang.ThreadGroup.uncaughtException:693 java.lang.ThreadGroup.uncaughtException:690
Android Studio 2.0, Kotlin 1.0.1-2
- Prueba de unidad en la función de extensión de Kotlin en las clases de SDK de Android
- ¿Kotlin Android Extensions pone en caché las propiedades sintéticas o cada vez que llama a findViewById ()?
- Android Studio 3.0 Los cambios de Kotlin no se reflejan en la compilación
- Varargs Kotlin interoperabilidad Java no funciona correctamente
- Cómo utilizar fragmentos con kotlin
- Android Kotlin: java.lang.NoClassDefFoundError: Resolución fallida de: <KotlinObject>
- Advertencia de tiempo de ejecución de Kotlin desactualizada (plugin Kotlin 1.1.2-release-Studio2.3-3)
- Este tipo tiene un constructor y debe ser inicializado aquí - Kotlin
Adaptado de un comentario sobre la respuesta original:
En Kotlin, no necesitas todos los elementos para declarar un singleton. Al declarar tu clase, simplemente haz que sea un object
así:
object TokenHelper { var token: String? = null var appId: String? = null var installationId: String? = null var userId: String? = null }
A continuación, acceda a ella de la siguiente manera: TokenHelper.token
o desde Java TokenHelper.INSTANCE.getToken()
.
Estás llamando al método getter de instance
recursivamente. Cambiar la definición de getter para usar el field
lugar:
var instance: TokenHelper? = null get() { if (field == null) { field = TokenHelper() } return field }
El extracto pertinente de la documentación:
Las clases en Kotlin no pueden tener campos. Sin embargo, a veces es necesario tener un campo de respaldo cuando se utilizan accesores personalizados. A estos efectos, Kotlin proporciona un campo de respaldo automático al que se puede acceder mediante el identificador de campo:
var counter = 0 // the initializer value is written directly to the backing field set(value) { if (value >= 0) field = value }
El identificador de campo sólo se puede utilizar en los accesores de la propiedad.
- Android ImageButton frontera?
- Haga clic en un elemento ListView cambia el estado de los elementos dentro del elemento?