#class #kotlin #constructor
Вопрос:
class EditorImpl(text: String) : Editor { private val myDocument: Document init { myDocument = DocumentImpl(text) } //secondary constructor constructor(document: Document) : this(document.getText()) { } override fun getText(): CharSequence { return myDocument.getText() } override fun setText(text: String) { myDocument.setText(text) } override fun getChars(): CharSequence { return getText() } override fun putChar(chars: CharSequence) { setText(chars.toString()) } override fun getDocument(): Document { return myDocument } }
Как мне убедиться, что параметр «документ«, переданный во вторичном конструкторе, назначен полю «MyDocument«, поскольку каждый вторичный конструктор должен вызывать основной конструктор? Я не хочу менять конструкторов местами. Заранее спасибо.
Комментарии:
1. Я не хочу менять конструкторов — почему?
Ответ №1:
Вы упомянули, что не хотите менять конструкторы, но если у вас нет реальных причин против этого, это определенно должно быть правильным решением.
Если имеет смысл, что пользователи могут создавать экземпляр с помощью пользовательского документа, то это должен быть основной конструктор, потому что именно он определяет большинство вещей для класса. Конструктор с text
просто сахаром для автоматического создания Document
из этого текста:
class EditorImpl(private val myDocument: Document) : Editor { constructor(text: String) : this(DocumentImpl(text)) override fun getText(): CharSequence = myDocument.getText() override fun setText(text: String) { myDocument.setText(text) } override fun getChars(): CharSequence = getText() override fun putChar(chars: CharSequence) { setText(chars.toString()) } override fun getDocument(): Document = myDocument }
Также в качестве примечания, Document
Editor
определены ли и в Java? Этот подход к настройке/получению не очень идиоматичен в Kotlin, если это пользовательские классы/интерфейсы, рассмотрите возможность использования свойств Kotlin вместо этого.