DEV Community

Kirill Bubochkin
Kirill Bubochkin

Posted on

Don't be always late...

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);
}
Enter fullscreen mode Exit fullscreen mode

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);
}
Enter fullscreen mode Exit fullscreen mode

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);
}
Enter fullscreen mode Exit fullscreen mode

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.
Enter fullscreen mode Exit fullscreen mode

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);
}
Enter fullscreen mode Exit fullscreen mode

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.
Enter fullscreen mode Exit fullscreen mode

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!

Discussion (0)