Из Java на Kotlin (Plugin)
Как перенести код на Kotlin
Java
public class XXX extends TextComponentEditorAction {
public XXX (EditorActionHandler defaultHandler) {
super(defaultHandler);
}
public XXX () {
this(new Handler());
}
private static class Handler extends EditorWriteActionHandler {
private Handler() {
}
@Override
public void executeWriteAction(final Editor editor, @Nullable Caret caret, DataContext dataContext) {
// Какой то код
}
Так же есть класс с plugin.xml
<actions>
<!-- Add your actions here -->
<action id="com.tm.XXX" class="com.tm.XXX" text="XXXxxx" description="XXX xx xx">
<add-to-group group-id="EditorActions" anchor="last"/>
<keyboard-shortcut keymap="$default" first-keystroke="ctrl alt NUMPAD5"/>
</action>
</actions>
Пробовал несколько вариантов но так как конструктор должен быть без параметров, не пойму как это реализовать на kotlin
Kotlin
class XXX (defaultHandler: EditorActionHandler) : TextComponentEditorAction(defaultHandler) {
init {
Handler()
}
class Handler() : EditorWriteActionHandler() {
ругается на то что class="com.tm.XXX" должен иметь пустой конструктор. Как это можно победить?
Ответы (1 шт):
В java у Вас 2 конструктора, в kotlin можно обойтись одним + добавить аннотацию @JvmOverloads для перегрузки конструктора.
class XXX @JvmOverloads constructor(defaultHandler: EditorActionHandler = Handler()) : TextComponentEditorAction(defaultHandler)
Что тут происходит, мы объявляем главный конструктор в котором инициализируем defaultHandler, инициализация нужна для того, чтобы в случае создания экземпляра класса без передачи аргументов в конструктор у нас было значение по умолчанию, если мы при создании экземпляра класса передадим в качестве аргумента другой Handler(), то он перезапишет значение по умолчанию у defaultHandler. @JvmOverloads создаст перегруженные версии конструктора, в том числе и пустой.