Do you know Java: Pattern Matching for instanceof
Java 15 brings a syntactic sugar, called Pattern Matching for instanceof, with which we can shorten the code and make it more safe.
In prior versions of Java, the instanceof operator workes as follows:
Object o = "asdf";
if (o instanceof String) {
String s = (String) o;
System.out.println(o);
}
Java 15 - and Java 14 as a preview feature - introduces an enhanced instanceof operator,
which brings the ability to cast the eximined instance to the type of the right operand.
Object o = "apple";
if (o instanceof String s) {
System.out.println(s);
}
List<String> animals = Arrays.asList("cat", "dog");
if (animals instanceof List<? extends Object> list) {
System.out.println(list);
}
Scope
Variable s is introduced in the scope of if statement, though it is not available
in else.
Object o = "apple";
if (o instanceof String s) {
System.out.println(s);
} else {
// System.out.println(s); // does not compile, s is not known
}
Shadowing
Once a variable - like s in the sample - is introduced on class or instance level,
then a variable with the same name introduced by instanceof can shadow the previous one
in if branching.
That does not work with local variables!
private final String s = "...";
// ...
Object o = "...";
if (o instanceof String s) {
System.out.println(s);
} else {
System.out.println(s); // it does compile
}
You can compile previews with
javac --enable-preview --release 14 Main.javaand run withjava --enable-preview Main
I am realy looking forward instanceof operator with pattern matching.
Further reading about JEP 305: Pattern Matching for instanceof
Code can be found: https://github.com/torokmark/do-you-know-java