In the following:
sealed interface Uninteresting permits Outer, Inner, InnerInner{ }
record Outer(Inner inner, int x) implements Uninteresting { }
record Inner(InnerInner innerInner, int y) implements Uninteresting { }
record InnerInner(int z) implements Uninteresting { }
void test() {
var outer = new Outer(new Inner(new InnerInner(3), 4), 2);
switch (outer) {
case Outer(Inner(InnerInner(var z), var y), var x) -> {
System.out.println(z);
System.out.println(y);
System.out.println(x);
System.out.println(outer);
System.out.println(i); // <- how to reference the Inner?
System.out.println(ii); // <- how to reference the InnerInner?
}
}
}
I would like to name the Inner and InnerInner objects I match against. It seems that I can use nested switch statements for this:
switch (outer) {
case Outer(var i, var x) -> {
switch (i) {
case Inner(var ii, var y) -> {
switch (ii) {
case InnerInner(var z) -> {
System.out.println(z);
System.out.println(y);
System.out.println(x);
System.out.println(outer);
System.out.println(i);
System.out.println(ii);
}
}
}
}
}
}
In Scala, I can use i@Inner and ii@InnerInner in my match, which would be something like:
case Outer(i@Inner(ii@InnerInner(var z), var y), var x)
Is there a more succinct way to write this sort of logic in modern Java?