New candidate JEP: 456: Unnamed Variables and Patterns

Gavin Bierman gavin.bierman at oracle.com
Tue Sep 26 16:14:23 UTC 2023


That’s right. We made a decision to simplify the grammar of switch labels for the JEP to only have a single pattern. However, if you use the "colon form” you can express similar code:

gmb at gmb-mac src % cat Switch.java
public class Switch {

    sealed interface X { }

    enum E implements X {A;}

    record R() implements X { }

    public void work(X x) {
        var result = switch (x) {
            case E.A:
            case R(): yield 42;
                // exhaustive!
        };
    }

    public static void main(String[] args) {
        System.out.println("complete");
    }
}
gmb at gmb-mac src % java Switch.java
complete


As you point out, a more uniform treatment would treat all constants as patterns and allow them all to appear in pattern lists of record patterns, for example. Working on it!!

Gavin

On 26 Sep 2023, at 14:52, Brian Goetz <brian.goetz at oracle.com> wrote:

I see now I answered a slightly different question :)

We do support case labels for enums in pattern switches, and they participate in exhaustiveness.  But we don't currently support mixing `case pattern, constant-label` in a single case label.  This is waiting for a more comprehensive treatment of constants as patterns.

On 9/26/2023 8:32 AM, Tagir Valeev wrote:

Hello! As we are finalizing this feature, can we squeeze in a little
improvement? Namely, support enum and patterns within the same case
label, provided that the patterns do not declare any variables. Like:

enum X {A, B}

static void test(Object obj) {
  switch (obj) {
    case String _, X.B -> System.out.println("B or String");
    default -> System.out.println("other");
  }
}

public static void main(String[] args) {
  Test.test("ddd");
  Test.test(X.B);
}

Currently, such a code is not supported. Or will it be considered in
future JEPs?

With best regards,
Tagir Valeev.

On Mon, Sep 25, 2023 at 6:25 PM Mark Reinhold <mark.reinhold at oracle.com><mailto:mark.reinhold at oracle.com> wrote:


https://openjdk.org/jeps/456

  Summary: Enhance the Java language with unnamed variables, which
  can be initialized but not used, and unnamed patterns, which match a
  record component without stating the component's name or type. Both are
  denoted by an underscore character, _.

- Mark



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-dev/attachments/20230926/31f2bd38/attachment.htm>


More information about the amber-dev mailing list