Как я могу наиболее правильно задать на 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 шт):
В 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(// тут нужный вам конструктор)
Вроде как-то так должно быть :)
Здесь есть 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
}
}