La nouvelle version LTS (version 17) de Java est sortie en septembre. Et depuis la précédente LTS (version 11), de nombreuses fonctionnalités intéressantes ont été ajoutées. L’un des plus cool est « Pattern Matching for instanceof
« .
Jusqu’à Java 15, lorsque nous vérifiions si un objet est une instance d’une classe particulière, le compilateur n’infligeait pas le type de la variable, même si l’objet passait la condition. À cause de cela, nous devions toujours lancer après le instanceof
Chèque.
Si nous essayons de compiler le code suivant sans transtypage :
public class InstanceOfDemo {
public static void main(String[] args) {
Number n = 42;
if (n instanceof Integer) {
System.out.println(n.compareTo(21));
}
}
}
L’erreur suivante se produira :
InstanceOfDemo.java:6: error: cannot find symbol
System.out.println(n.compareTo(21));
^
symbol: method compareTo(int)
location: variable n of type Number
1 error
error: compilation failed
Cela se produit parce que le compareTo
méthode est déclarée par Integer
et pas Number
.
Ainsi, lorsque nous convertissons la variable en Integer
, il compile.
public class InstanceOfDemo {
public static void main(String[] args) {
Number n = 42;
if (n instanceof Integer) {
System.out.println(((Integer)n).compareTo(21));
}
}
}
$ java InstanceOfDemo.java
1
À partir de Java 16 et des versions plus récentes, nous n’avons plus besoin de transtyper la variable. Nous déclarons simplement une nouvelle variable dans le instanceof
déclaration.
public class InstanceOfDemo {
public static void main(String[] args) {
Number n = 42;
if (n instanceof Integer i) {
System.out.println(i.compareTo(21));
}
}
}
Notez la nouvelle variable i
dans l’extrait ci-dessus.
C’est ça! La nouvelle fonctionnalité de Java 16 élimine le instanceof
-et-castez l’idiome de notre code.
Si vous souhaitez en savoir plus sur le JEP 394, vous pouvez consulter sa page ici.
Si vous avez des questions, n’hésitez pas à laisser un message dans la session de commentaires.