Вторичный конструктор Котлина и Первичный конструктор

#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 вместо этого.