Don’t be always late…

Kirill Bubochkin
2 min readOct 28, 2021

--

In code reviews, I often see a construction like this:

enum Some { option1, option2 }

final someCondition = Some.option2;

void main() {
late final String x;

switch (someCondition) {
case Some.option1:
x = 'a';
break;
case Some.option2:
x = 'b';
break;
}

print(x);
}

Take a look at the line late final String x. At first glance, there's nothing wrong with it: we don't initialize x immediately, but at some point later, so late modifier seems to be a good fit here, right?

Wrong. Dart compiler is smart enough to understand that there’s no way for x to be unitialized when it's called at print(x). So you can just omit late modifier:

enum Some { option1, option2 }

final someCondition = Some.option2;

void main() {
final String x;

switch (someCondition) {
case Some.option1:
x = 'a';
break;
case Some.option2:
x = 'b';
break;
}

print(x);
}

And it’s not just about being concise. It actually guards you against making an error. Take a look at the following snippet:

enum Some { option1, option2 }

final someCondition = Some.option2;

void main() {
late final String x;

switch (someCondition) {
case Some.option1:
x = 'a';
break;
}

print(x);
}

Do you see an error here? We don’t process all the possible cases and, since in our case, someCondition == Some.option2 we will get a runtime error:

Uncaught Error: LateInitializationError: Local 'x' has not been initialized.

What if we remove late modifier?

enum Some { option1, option2 }

final someCondition = Some.option2;

void main() {
final String x;

switch (someCondition) {
case Some.option1:
x = 'a';
break;
}

print(x);
}

Now, we can’t even run the code, since we get a compile-time error:

Error: Final variable 'x' must be assigned before it can be used. print(x); ^ Error: Compilation failed.

It can help you in other cases as well, such as if..else or try..catch blocks.

So pay attention to this small detail and stay safe!

Originally published at https://dev.to on October 28, 2021.

--

--