Pattern variable and field shadowing

Remi Forax forax at univ-mlv.fr
Mon Dec 2 22:59:34 UTC 2019


----- Mail original -----
> De: "Gavin Bierman" <gavin.bierman at oracle.com>
> À: "Tagir Valeev" <amaembo at gmail.com>
> Cc: "amber-spec-experts" <amber-spec-experts at openjdk.java.net>
> Envoyé: Lundi 2 Décembre 2019 13:18:43
> Objet: Re: Pattern variable and field shadowing

> Hi Tagir,
> 
> No, that’s very much the expected behaviour. The idea of flow scoping is that a
> pattern variable is only *in scope* where it has definitely matched. Thus, in
> places where it is definitely not matched - like your else block - it is not in
> scope. Thus it doesn’t exist. Thus if there is field with that name, then that
> is the meaning of the name.
> 
> We looked long and hard at exactly this example; as Brian mentioned, it is
> called the “Swiss cheese” problem in the team! The problem is that not doing
> this also comes at a heavy cost. For example, we could say that the variable
> str in your example is in scope but not DA, for example. But that means that
> using a pattern variable poisons it forever more in the statement/block. This
> forbids very, very common code like:
> 
> if (a instanceof Point p) {
>> } else {
>    if (b instanceof Point p) { // Can’t use p even though it won’t be bound
>>    }
> }
> 
> In other words, you’ll have to find a new pattern variable everytime. [And this
> gets even worse in switch.] That’s a real pain, and I think most people will
> say “why do I have to find a new name, can’t you figure it out?”. Yes, we
> could, but then we’d have to do something even more special case, like allowing
> shadowing of pattern variables with pattern variables. But we’re now
> unravelling all sorts of aspects of the way Java deals with naming, and that
> feels like something that most users will never have in their heads. We’re
> hoping the “only in scope where it is matched” is a simpler rule that is easier
> to internalize.
> 
> That’s not to say that there couldn’t be tooling to provide warnings in the case
> where pattern variables shadow fields (as it inevitably means that there will
> be some holes in the cheese), hint hint :-)

why not javac being "the tooling" ?
I think it will be useful for our users if javac emit such warning (if the linter is activated).

> 
> But please use the preview feature and let us know how you get along so we can
> assess this design decision.
> 
> Thanks,
> Gavin

regards,
Rémi

> 
> 
>> On 28 Nov 2019, at 03:39, Tagir Valeev <amaembo at gmail.com> wrote:
>> 
>> Hello!
>> 
>> Consider the following code:
>> 
>> public class A {
>>    private String str;
>> 
>>    public void f(Object obj) {
>>        if (obj instanceof String str) {
>>            System.out.println(str.toLowerCase()); // str refers to
>> pattern binding
>>        } else {
>>            System.out.println(str.toLowerCase()); // str refers to the field
>>        }
>>    }
>> }
>> 
>> I thought that such a code should be rejected by the compiler, as it's
>> confusing and could be a source of very subtle bugs. However, I
>> haven't found any explicit statement regarding this in the latest spec
>> draft [1]. Could you please clarify whether such code is acceptable
>> and point me to the relevant part of the spec draft. Thank you!
>> 
>> With best regards,
>> Tagir Valeev.
>> 
>> [1]
> > http://cr.openjdk.java.net/~gbierman/jep305/jep305-20191021/specs/patterns-instanceof-jls.html


More information about the amber-spec-observers mailing list