Конструктор против параметра в Котлине - PullRequest
0 голосов
/ 26 января 2019

В чем разница между:

class Pitch(var width: Int = 3, var height: Int = 5) {

    constructor(capacity: Int): this()

}

и

class Pitch(var width: Int = 3, var height: Int = 5, capacity: Int)

Какие преимущества дает конструктор?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Какие преимущества дает конструктор?

В вашем первом фрагменте вы определяете два конструктора, один основной и один дополнительный. Эта особенность первичного конструктора заключается в том, что он всегда должен вызываться любым вторичным конструктором.

class Pitch (var width: Int = 3, var height: Int = 5) /* primary constructor */ {
    // secondary constructor invokes primary constructor (with default values)
    constructor(capacity: Int): this()
}

В обоих случаях: Pitch() и Pitch(10, 20) вызывается основной конструктор. Pitch (10) вызовет вторичный конструктор.

Если вы хотите вызвать первичный конструктор для этого экземпляра Pitch(10), вы должны явно указать имя параметра следующим образом:

Pitch(width = 30)

Вы также можете повернуть его и явно установить height и оставить для width значение по умолчанию:

Pitch(height = 30)

Как вы видите, используя два параметра (свойства) со значениями по умолчанию для каждого, у вас остается 4 возможности создать экземпляр класса только с помощью основного конструктора.

Указание вторичного конструктора особенно полезно для предоставления альтернативного способа создания экземпляра класса.


Используя это так

class Pitch(var width: Int = 3, var height: Int = 5, capacity: Int)

имеет смысл только тогда, когда вы не можете вывести значение capacity из width и height. Итак, это зависит от вашего варианта использования.

0 голосов
/ 26 января 2019

Когда вы определяете свой класс следующим образом:

class Pitch (var width: Int = 3, var height: Int = 5) {

    constructor(capacity: Int): this() {}

}

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

val p = Pitch()

// also you can invoke constructors like this
val p1 = Pitch(30)     // invoked secondary constructor
val p2 = Pitch(30, 20) // invoked primary constructor

Когда вы определяете свой класс следующим образом:

class Pitch (var width: Int = 3, var height: Int = 5, capacity: Int) {

}

обязательны все параметры, кроме тех, которые имеют значения по умолчанию. Таким образом, в этом случае вы не можете использовать конструктор с пустыми параметрами, вам нужно указать хотя бы один параметр capacity:

val p = Pitch(capacity = 40)

Так что в первом случае у вас есть преимущество использования конструктора без параметров. Во втором случае, если вы хотите вызвать конструктор и передать параметр capacity, вы должны указать его явно при использовании конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...