метод getter бросает StackOverflowError

Я пытаюсь использовать привязку данных в Android. Но в итоге получите ошибку StackOverflow.

loginViewModel.kt

class loginViewModel(): BaseObservable() { @Bindable var errorEmail:String?=null get() { if (userEmailAddress.isNullOrBlank()) return "Please Enter the Email Address" else if (!isValidEmail(userEmailAddress)) return "Enter Valid Email Id." else return null } var userEmailAddress:String= String() set(userEmailAddress){ field=userEmailAddress notifyPropertyChanged(R.id.email_address) /*to check Email for validation on every character inserted by user*/ notifyPropertyChanged(BR.errorEmail) } get() { return userEmailAddress } } 

Журнал ошибок:

 07-04 13:54:15.435 6865-6865/com.example.itstym.reminder D/AndroidRuntime: Shutting down VM 07-04 13:54:15.513 6865-6865/com.example.itstym.reminder E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.itstym.reminder, PID: 6865 java.lang.StackOverflowError: stack size 8MB at com.example.itstym.reminder.loginViewModel.getUserEmailAddress(loginViewModel.kt:49) at com.example.itstym.reminder.loginViewModel.getUserEmailAddress(loginViewModel.kt:49) 

Я знаю, что ошибка StackOverflow возникает, когда есть какой-либо рекурсивный вызов, но я не могу понять, как решить эту ошибку?

 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> <data class="ActivityMainBinding"> <variable name="login" type="com.example.itstym.reminder.loginViewModel" /> </data> <android.support.constraint.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.itstym.reminder.MainActivity"> <EditText app:error="@{login.errorEmail}" android:text="@{login.userEmailAddress}" android:hint="Email Address" android:id="@+id/email_address" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:layout_marginStart="8dp" android:ems="10" android:inputType="textPersonName" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="24dp"/> </layout> 

Вы также должны использовать field в своем получателе, иначе оно будет рекурсивно называть себя:

 var userEmailAddress: String = String() set(userEmailAddress){ field = userEmailAddress ... } get() { return field // <-- here } 

Вы рекурсивно называете геттер. Вы должны написать

 get() = field 

вместо

 get() { return userEmailAddress } 

Идентификатор field используется в аксессуарах свойства для обеспечения доступа к полю userEmailAddress копирования, в то время как обращение к userEmailAddress завершается вызовом getUserEmailAddress() который приводит к бесконечному циклу и StackOverflowError .