> On Apr 29, 2020, at 12:35 PM, Guy Steele <guy.ste...@oracle.com> wrote:
>
>
>
>> On Apr 29, 2020, at 2:23 PM, Dan Smith <daniel.sm...@oracle.com> wrote:
>>
>>
>>> On Apr 29, 2020, at 11:28 AM, Guy Steele <guy.ste...@oracle.com> wrote:
>>>
>>> Appealing, but it does raise the question of whether, if the programmer
>>> uses some sneaky trick such as calling super, this can really be enforced
>>> ar compile time on all cases. If it can (after all), then your proposed
>>> wording looks good to me.
>>
>> The idea would be to rely on the definition of "assign to" in JLS 16. That
>> uses a heuristic that counts "x =" or "this.x =" (and, in javac, but not
>> currently specified properly, "(this).x", etc.)
>>
>> Stepping back: in general, it's illegal to assign to a final field. There's
>> one exception: inside a constructor, where the field is DU, using an
>> assignment that satisfies the heuristic. In any other case, you get an error.
>>
>> So the language has carved out a small hole permitting assignments, and this
>> rule closes that hole.
>
> That's all very good.
>
> But I'm worried about cases where you use some escape catch such as calling
> super or a static method, passing it "this" as an argument if necessary, and
> arriving at a place where you need to solve the halting problem to decide at
> compile time whether the forbidden behavior might occur. I haven't swapped
> all the current rules back into head enough to decide for myself whether this
> sort of scenario can actually arise.
I'm leaning heavily on "in general, it's illegal to assign to a final field".
If you try to construct your exploit, you will find that when you try to assign
to the field, you'll get a "can't assign to final field" error.