On Fri, May 31, 2024 at 7:13 PM Larry Garfield <[email protected]>
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