StackOverflowError с использованием Singleton в Котлине

Может кто-нибудь сказать, почему я получаю java.lang.StackOverflowError используя этот класс Kotlin? Строка 41 равна 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 } } } 

Трассировки стека:

 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

Адаптировано из комментария к исходному ответу:

В Котлине вам не нужен весь шаблон, чтобы объявить синглтон. Когда вы объявляете свой класс, просто сделайте его таким же:

 object TokenHelper { var token: String? = null var appId: String? = null var installationId: String? = null var userId: String? = null } 

Затем TokenHelper.token к нему следующим образом: TokenHelper.token или из Java TokenHelper.INSTANCE.getToken() .

Вы вызываете метод getter instance рекурсивно. Измените определение getter вместо field :

 var instance: TokenHelper? = null get() { if (field == null) { field = TokenHelper() } return field } 

Соответствующая выдержка из документации:

Классы в Котлине не могут иметь полей. Однако иногда при использовании пользовательских аксессуаров необходимо иметь резервное поле. Для этих целей Kotlin предоставляет автоматическое поле поддержки, к которому можно получить доступ, используя идентификатор поля:

 var counter = 0 // the initializer value is written directly to the backing field set(value) { if (value >= 0) field = value } 

Идентификатор поля может использоваться только в аксессуарах объекта.