Может быть, что-то следующее может быть хорошо для вас. Вы можете заменить Pair
фактическим типом, а затем ...
class MyClass(
val A: String,
val BC : Pair<String, String>
) {
constructor(A: String, B: String, C: String) : this(A, B to C) // is this then even needed?
constructor(A : String) : this(A, Calculator.calculate(A))
}
Или, в качестве альтернативы, если имеет больше смысла иметь три отдельных свойства, наоборот, что также было показано k0enf0rNL :
class MyClass(
val A: String,
val B: String,
val C: String
) {
constructor(A: String) : this(A, Calculator.calculate(A))
constructor(A: String, BC : Pair<String, String>) : this(A, BC.first, BC.second)
}
Наконец, если вы не хотите показывать некоторые конструкторы, не стесняйтесь пометить их private
, например. следующее будет отображать то же, что и показанный вами пример:
class MyClass(
val A: String,
val B: String,
val C: String
) {
constructor(A: String) : this(A, Calculator.calculate(A))
private constructor(A: String, BC : Pair<String, String>) : this(A, BC.first, BC.second)
}
Возможно, вам, скорее, нужно что-то для передачи функции (как вы также использовали Calculator.calculate(A)
). Тогда вы можете добавить следующее в качестве конструктора:
constructor(A : String, func: (String) -> Pair<String, String> = Calculator::calculate) : this(A, func(A))
Если это именно то, что вы хотели с самого начала, то даже такой класс, как следующий, может быть чем-то для вас:
class MyClass(val A: String,
func: (String) -> Pair<String, String> = Calculator::calculate) {
val B: String
val C: String
init {
func(A).also { (newB, newC) ->
B = newB
C = newC
}
}
}
Если вы хотите просто передать A
, B
и C
без фактического вычисления (или переданной функции), вы все равно можете сделать это следующим образом (в основном, отбрасывая переданные A
):
MyClass("myA") { /* _ -> */ /* A -> */
"myCalculatedB" to "C"
}