And re: using final in methods, I'm a little ambivalent about that. I like brevity in my declarations, _and_ self-documenting code. It's why I tend to use type annotations in local vars, but sometimes leave off the generic type arguments. The exactness of the declarations depends for me on how much that variable is used in the method and how clear it is what the type is, w/o any explicit documentation.

I do like final for fields. With those the risk of accidental modification is much high, and the fact that the field is not modifiable is part of the class APIs contract. In fact, I think always declaring a field as final, when it is initialized using the constructor shorthand, is a best-practice. I have run into this bug once or twice:
```
class Foo {
  String bar;
  Foo(bar);
}
```
When you read the code quickly, you might think that `bar` is assigned in the ctor. If instead `bar` is declared as `final`, the analyzer will warn you that bar is never inited.
```
class Foo {
  final String bar;
  Foo(this.bar);
}
```