On Fri, May 31, 2024 at 7:13 PM Larry Garfield <la...@garfieldtech.com> wrote:
> > So we feel the best way forward is to make the following changes: > > * private(set) implicitly means "final". (You can declare it explicitly > if you want, but it isn't necessary.) > * Make readonly incompatible with aviz again. > > Thoughts? > I think making properties `final` when using `private(set)` is a good solution to this. I don't think `readonly` needs to be incompatible with aviz. We can have `readonly` act as `private(set`) but not `final` by default. But you can define it as `private(set) readonly`, and in this case it will be `final`, practically the same as `final readonly`. It would go like this: - private(set) -> final, private(set) - final private(set) -> final, private(set) - readonly -> write-once, private(set) - final readonly -> final, write-once, private(set) - private(set) readonly -> final, write-once, private(set) - protected(set) readonly -> write-once, protected(set) - public(set) readonly -> write-once, public(set) > > Also, Alexandru noted earlier that final properties don't seem to be > supported in constructor promotion. That's an oversight from the hooks > implementation, not a design choice, so Ilija will just fix that as part of > the hooks PR before it gets fully merged. > Maybe we need to have some discussion/considerations about allowing new modifiers on constructor promoted properties parameters. Right now there is no `final` modifier for parameters, but this means we might not be able to allow them in the future. In other languages (Java), it makes the parameter variable a constant (not reassignable). So this decision might have implications so that when we decide to make variables or parameters not reassignable, we will not be able to use "final" as a keyword. Not saying there is a problem, just that we need to be aware of it, as probably `final` is not a very good choice, and `const` or `readonly` are probably better options. Alex