Канлинский способ Котлина инициализировать два или более значений в некоторых условиях - PullRequest
0 голосов
/ 30 ноября 2018

Каков канонический способ инициализации двух (или более) значений по условию?

var a : Int;// I want this to be val, not var
var b: Int;// I want this to be val, not var too

if(condition) {
 a = 1
 b = 2
} else {
 a = 3
 b = 4
}

Использование «if» несколько раз не удобно, так как может быть множество переменных и множество условий

val a = if(condition) 1 else 2
val b = if(condition) 3 else 4

Ответы [ 4 ]

0 голосов
/ 30 ноября 2018

Если вы инициализируете в init -блоке (или конструкторе), вы можете использовать val, который выглядит очень чисто и использует только один if:

class foo(){
    val a : Int
    val b : Int

    init{
        if(condition) {
            a = 1
            b = 2
        } else {
            a = 3
            b = 4
        }
    }
}

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

0 голосов
/ 30 ноября 2018

Для этой цели вы можете использовать Декларации разрушения .

val (a, b, c) = if (condition) listOf(1, 2, 3) else listOf(4, 5, 6)

Для разных типов вы можете комбинировать его с созданием объекта:

data class ValueInitializer(
    val a: Int,
    val b: String
)

val (a: Int, b: String) = if (condition) 
         ValueInitializer(1, "String") 
    else 
         ValueInitializer(2, "String2")

Еще один моментчто вы можете использовать val вместо var в вашем первом примере, если a и b - локальные переменные.Для полей класса вы можете инициализировать их внутри блока init или пометить их модификатором lateinit.

0 голосов
/ 30 ноября 2018

Хотя использование кортежей и деструктуризация приятно и лаконично, вы можете просто использовать val вместо var в коде вопроса!

(я пробовал, и это работаетотлично для меня в IDEA с Kotlin 1.3.10.)

В Java каждый из них будет называться «пустой финал»;Я не знаю, использует ли Котлин такой же термин.В любом случае, если компилятор может видеть, что такая переменная всегда инициализируется ровно один раз (что они и делают здесь), это радует.

0 голосов
/ 30 ноября 2018

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

val (a, b) = if (condition) 1 to 2 else 3 to 4

Более подробную информацию вы можете найти в документации: https://kotlinlang.org/docs/reference/multi-declarations.html#destructuring-declarations

Для 3 переменных вы можете использовать Triple:

val (a, b, c) = if (condition) Triple(1, 2, 3) else Triple(3, 4, 5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...