Как я могу наиболее правильно задать на Kotlin один конструктор без параметров и один конструктор с n параметрами?

Пример на Java - имеется класс MessageEvent c какими-то полями, не суть важно, пусть будет:

public String key;
public User user;
private int pos;

Я делаю два конструктора

public MessageEvent(User user, String key) {
        this.user = user;
        this.key=key;
    }

public MessageEvent(User user,String key,int pos){ 
        this.user=user;
        this.key=key;
        this.pos=pos;
    }

Хочу из других классов иметь возможность вызывать разные конструкторы и таким образом задавать разную конфигурацию класса MessageEvent. Каким образом наиболее верно это будет выглядеть на Kotlin?Пихать null в те параметры которые не использую выглядит костыльно


Ответы (2 шт):

Автор решения: Andrew

В kotlin насколько я знаю делается тоже два конструктора, и вызывается тот который вам нужен. Выглядеть это будет приблизительно так:

class MessageEvent() {
    var pos:Int?=null
    var user:User
    var key:String?=null

    constructor(user:User, key:String) : this() { 
      this.user=user;
      this.key=key;
    }

    constructor(user:User, key:String, pos:Int) : this() { 
      this.user=user;
      this.key=key;
      this.pos=pos;
    }

}

и дальше вызов будет выглядеть так:

MessageEvent(// тут нужный вам конструктор)

Вроде как-то так должно быть :)

→ Ссылка
Автор решения: Sergei Buvaka

Здесь есть primary constructor который принимает все аргументы. И есть secondary constructor, который принимает только 2 аргумента.

class MessageEvent(
    val user: User,
    val key: String,
    val pos: Int?
) {

    constructor(user: User, key: String) : this(user, key, null)
}

Либо еще проще:

class MessageEvent(
    val user: User,
    val key: String,
    val pos: Int? = null // можно к примеру и так записать, если не хотите работать с null 'val pos: Int = 0'
)

Тогда вы можете задавать только 2 параметра, а третий по дефолту будет null, или же все три параметра вместе с pos.

В целом используя второй вариант вы можете задавать любое количество дефолтных параметров (паттерн Builder).

UPD. С пустым конструктором:

class MessageEvent(
        val user: User? = null,
        val key: String? = null,
        val pos: Int? = null
    ) 

Простой вариант.

Можете сделать что-то вроде такого:

class MessageEvent() {
        var user: User? = null,
        var key: String? = null,
        var pos: Int? = null
    
        constructor(user: User, key: String, pos: Int) : this() {
            this.user = user,
            this.key = key,
            this.pos = pos
        }
    }

Статья на тему конструкторов.

→ Ссылка