DEV Community

Cover image for Why Avoid Late Variables in Dart ??
Areeba Farooq
Areeba Farooq

Posted on

Why Avoid Late Variables in Dart ??

๐—›๐—ผ๐˜„ ๐—Ÿ๐—ฎ๐˜๐—ฒ ๐—ฉ๐—ฎ๐—ฟ๐—ถ๐—ฎ๐—ฏ๐—น๐—ฒ๐˜€ ๐—ฐ๐—ฎ๐—ป ๐—ฏ๐—ฒ ๐—ฉ๐˜‚๐—น๐—ป๐—ฒ๐—ฟ๐—ฎ๐—ฏ๐—น๐—ฒ?

Instance fields can be initialized in 4 ways:

  1. At the point of protestation
  2. In a constructor argument using 'this'
  3. In the constructorโ€™s initializer list before the law in braces starts.
  4. Anywhere Differently

4 is problematic since the preface of null safety. By the time the constructor body( the law in braces) starts, the object must be completely initialized so each of its fields are usable. So if it isn't initialized in 1, 2, or 3, it fails to collect.
๐–๐ž ๐œ๐š๐ง ๐Ÿ๐ข๐ฑ ๐ญ๐ก๐ข๐ฌ ๐›๐ฒ' ๐ฅ๐š๐ญ๐ž' ๐ค๐ž๐ฒ๐ฐ๐จ๐ซ๐.๐Ÿ˜ƒ

It literally means โ€œ I'll initialize it latterly โ€. And you got no error.
.
.
.

โš ๏ธ ๐๐ฎ๐ญ ๐ก๐ž๐ซ๐ž ๐š๐ซ๐ž ๐ญ๐ก๐ž ๐ซ๐ž๐š๐ฌ๐จ๐ง๐ฌ ๐ฐ๐ก๐ฒ ๐ฌ๐ก๐จ๐ฎ๐ฅ๐ ๐ฐ๐ž ๐ฌ๐ก๐จ๐ฎ๐ฅ๐ ๐š๐ฏ๐จ๐ข๐ ๐ฅ๐š๐ญ๐ž ๐ฏ๐š๐ซ๐ข๐š๐›๐ฅ๐ž๐ฌ:

๐Ÿ- ๐๐จ ๐œ๐จ๐ฆ๐ฉ๐ข๐ฅ๐ž - ๐ญ๐ข๐ฆ๐ž ๐œ๐ก๐ž๐œ๐ค ๐Ÿ๐จ๐ซ ๐ข๐ง๐ข๐ญ๐ข๐š๐ฅ๐ข๐ณ๐š๐ญ๐ข๐จ๐ง

Still, you only know this at runtime when the program fails, If you forget to initialize a late variable. Basically, you say โ€œ Trust me to initialize d ever before it's read for the first time โ€. So the compiler skips the initialization check and inserts a runtime check.

-

-

๐Ÿ- ๐‘๐ฎ๐ง๐ญ๐ข๐ฆ๐ž ๐œ๐ก๐ž๐œ๐ค๐ฌ ๐š๐ซ๐ž ๐ฌ๐ค๐ข๐ฉ๐ฉ๐ž๐ ๐š๐ญ ๐ก๐ข๐ ๐ก๐ž๐ซ ๐จ๐ฉ๐ญ๐ข๐ฆ๐ข๐ณ๐š๐ญ๐ข๐จ๐ง ๐ฅ๐ž๐ฏ๐ž๐ฅ๐ฌ

There's a stir to allow skipping the initialization checks in some shapes. This may beget segfault which is harder to probe than an ordinary exception.

-

-

๐Ÿ‘- ๐“๐š๐ค๐ž๐ฌ ๐ฆ๐จ๐ซ๐ž ๐ฆ๐ž๐ฆ๐จ๐ซ๐ฒ

Your program needs to know if a late variable has been initialized or not. For this, the compiler frequently creates a retired internal variable that takes memory.

-

-

๐Ÿ’- ๐€๐๐๐ข๐ญ๐ข๐จ๐ง๐š๐ฅ ๐ซ๐ž๐š๐ ๐š๐ง๐ โ€˜ ๐ข๐Ÿ โ€™ ๐›๐ž๐Ÿ๐จ๐ซ๐ž ๐ž๐š๐œ๐ก ๐ซ๐ž๐š๐

Every time you read a late variable the program must insure it's initialized, so a redundant check is added.

-

-

๐Ÿ“- ๐€๐๐๐ข๐ญ๐ข๐จ๐ง๐š๐ฅ ๐ฐ๐ซ๐ข๐ญ๐ž ๐›๐ž๐Ÿ๐จ๐ซ๐ž ๐ž๐š๐œ๐ก ๐ฐ๐ซ๐ข๐ญ๐ž.

Every time you write to a late variable the program sets the internal flag to note that it's initialized.

-

-

Hopefully, that helped. Did it? ๐Ÿ˜ƒ


Follow for further ๐Ÿ‘‡

Areeba Farooq

Top comments (2)

Collapse
 
andaeiii profile image
Ande Caleb

interesteen read.

Collapse
 
areedev profile image
Areeba Farooq

Thankyou :)