Ответ - потому что компилятор Котлина(точнее его создатели) считает, что это правильно. Оно компилируется в байткод, который аналогичен такому джава-коду:
public final class Test {
private int a;
public final int getA() {
return this.a;
}
public final void setA(int value) {
if (value > 0) {
this.a = 1;
} else {
this.a = -1;
}
}
public Test(int b) {
this.a = b;
}
}
Почему так - можно гадать, вот
тут описаны возможные причины:
* ты можешь обратиться к field, который ещё не инициалирован
* ты можешь обратиться к другим полям, которые в исходнике ниже, и поэтому будут инициализированы позже.