1. Changer d'expression
Dans les versions précédentes, changer d'expression n'était qu'une fonctionnalité "d'aperçu". Je voudrais vous rappeler que le but des fonctionnalités de l'étape « aperçu » est de recueillir des commentaires. Ces fonctionnalités peuvent changer à tout moment et, en fonction des résultats des commentaires, ces fonctionnalités peuvent même être supprimées, mais généralement toutes les fonctionnalités en aperçu. sera finalement corrigé en Java.
(Tutoriel recommandé : Programme de démarrage Java )
L'avantage de la nouvelle expression switch est qu'il n'y a plus de comportement de saut par défaut (fall-through), plus complet, et les expressions et combinaisons sont plus faciles à écrire, donc les bogues sont moins susceptibles de se produire. Par exemple, les expressions de commutation peuvent désormais utiliser la syntaxe des flèches, comme indiqué ci-dessous :
var log = switch (event) { case PLAY -> "User has triggered the play button"; case STOP, PAUSE -> "User needs a break"; default -> { String message = event.toString(); LocalDateTime now = LocalDateTime.now(); yield "Unknown event " + message + " logged on " + now; } };
2. Blocs de texte
L'une des fonctionnalités d'aperçu introduites dans Java 13 concerne les blocs de texte. . Avec les blocs de texte, les chaînes littérales multilignes sont faciles à écrire. Cette fonctionnalité obtient son deuxième aperçu dans Java 14, et il y a quelques changements. Par exemple, le formatage d'un texte multiligne peut nécessiter l'écriture de nombreuses opérations de concaténation de chaînes et de séquences d'échappement. Le code suivant montre un exemple HTML :
String html = "<HTML>" + "\n\t" + "<BODY>" + "\n\t\t" + "<H1>\"Java 14 is here!\"</H1>" + "\n\t" + "</BODY>" + "\n" + "</HTML>";
Avec les blocs de texte, ce processus peut être simplifié. Utilisez simplement des guillemets triples comme balises de début et de fin du bloc de texte, et vous pouvez écrire plus élégamment du code pour :
String html = """ <HTML> <BODY> <H1>"Java 14 is here!"</H1> </BODY> </HTML>""";
Les blocs de texte sont plus expressifs que les chaînes littérales ordinaires.
Java 14 introduit deux nouvelles séquences d'échappement. Tout d’abord, vous pouvez utiliser la nouvelle séquence d’échappement s pour représenter un espace. Deuxièmement, vous pouvez utiliser une barre oblique inverse pour éviter d'insérer un caractère de nouvelle ligne à la fin de la ligne. Cela permet de diviser facilement une longue ligne en plusieurs lignes dans un bloc de texte pour augmenter la lisibilité.
Par exemple, maintenant la façon d'écrire une chaîne multiligne est la suivante :
String literal = "Lorem ipsum dolor sit amet, consectetur adipiscing " + "elit, sed do eiusmod tempor incididunt ut labore " + "et dolore magna aliqua.";
En utilisant des séquences d'échappement dans des blocs de texte, elle peut être écrite comme ceci :
String text = """ Lorem ipsum dolor sit amet, consectetur adipiscing \ elit, sed do eiusmod tempor incididunt ut labore \ et dolore magna aliqua.\ """;
(Tutoriel vidéo recommandé :Tutoriel vidéo Java)
3. La correspondance de modèles d'instanceof
Java 14 introduit une fonctionnalité de prévisualisation, avec laquelle il n'est plus nécessaire. Écrivez du code qui passe d'abord par une instance de jugement, puis par une conversion forcée. Par exemple, le code suivant :
if (obj instanceof Group) { Group group = (Group) obj; // use group specific methods var entries = group.getEntries(); }
À l'aide de cette fonctionnalité d'aperçu, il peut être refactorisé en :
if (obj instanceof Group group) { var entries = group.getEntries(); }
Puisque la vérification conditionnelle nécessite que obj soit de type Groupe, pourquoi devez-vous inclure dans le code conditionnel comme le premier code ? Qu'en est-il de la spécification obj comme type de groupe dans le bloc ? Cela peut provoquer des erreurs.
Cette syntaxe plus concise peut éliminer la plupart des transtypages dans les programmes Java.
JEP 305 explique ce changement et donne un exemple tiré du livre de Joshua Bloch "Effective Java", démontrant les deux manières d'écrire équivalentes suivantes :
@Override public boolean equals(Object o) { return (o instanceof CaseInsensitiveString) && ((CaseInsensitiveString) o).s.equalsIgnoreCase(s); }
Ce paragraphe La CaseInsensitiveString redondante castée dans le code peut être supprimé et converti de la manière suivante :
@Override public boolean equals(Object o) { return (o instanceof CaseInsensitiveString cis) && cis.s.equalsIgnoreCase(s); }
Cette fonctionnalité d'aperçu vaut la peine d'être essayée car elle ouvre la porte à une correspondance de modèles plus générale. L'idée de la correspondance de modèles est de fournir une syntaxe pratique permettant au langage d'extraire des composants d'objets en fonction de conditions spécifiques. C'est exactement le cas d'utilisation de l'opérateur instanceof, puisque la condition est une vérification de type et que l'opération d'extraction nécessite d'appeler la méthode appropriée ou d'accéder à un champ spécifique.
En d'autres termes, cette fonction de prévisualisation n'est qu'un début. À l'avenir, cette fonction réduira certainement davantage la redondance du code, réduisant ainsi les risques de bugs.
4. Enregistrer
Une autre fonction de prévisualisation est l'enregistrement. Comme d'autres fonctions de prévisualisation introduites précédemment, cette fonction de prévisualisation suit également la tendance à réduire le code Java redondant et peut aider les développeurs à écrire un code plus précis. Record est principalement utilisé pour les classes dans des champs spécifiques. Sa fonction de déplacement consiste à stocker des données sans aucun comportement personnalisé.
Allons droit au but et prenons un exemple de la classe de domaine la plus simple : BankTransaction, qui représente une transaction et contient trois champs : date, montant et description. Il y a de nombreux aspects à prendre en compte lors de la définition d'une classe :
Constructeur, getter, méthode toString(), hashCode() et equals(). Le code de ces parties est généralement généré automatiquement par l'EDI et occupe une place. beaucoup d'espace. Voici la classe BankTransaction générée complète :
public class BankTransaction {private final LocalDate date; private final double amount; private final String description; public BankTransaction(final LocalDate date, final double amount, final String description) { this.date = date; this.amount = amount; this.description = description; } public LocalDate date() { return date; } public double amount() { return amount; } public String description() { return description; } @Override public String toString() { return "BankTransaction{" + "date=" + date + ", amount=" + amount + ", description='" + description + '\'' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; BankTransaction that = (BankTransaction) o; return Double.compare(that.amount, amount) == 0 && date.equals(that.date) && description.equals(that.description); } @Override public int hashCode() { return Objects.hash(date, amount, description); } }
Java 14 fournit un moyen de résoudre cette redondance et d'exprimer plus clairement le but : le seul but de cette classe est de rassembler des données. Record fournira des implémentations des méthodes equals, hashCode et toString. Par conséquent, la classe BankTransaction peut être refactorisée comme suit :
public record BankTransaction(LocalDate date,double amount, String description) {}
Grâce à l'enregistrement, vous pouvez obtenir "automatiquement" l'implémentation de equals, hashCode et toString, ainsi que les méthodes constructeur et getter.
Pour essayer cet exemple, vous devez compiler le fichier avec l'indicateur d'aperçu :
javac --enable-preview --release 14 Les champs de BankTransaction.javarecord sont implicitement définitifs. Par conséquent, les champs d'enregistrement ne peuvent pas être réaffectés. Mais il convient de noter que cela ne signifie pas que l'intégralité de l'enregistrement est immuable. Les objets stockés dans les champs peuvent être mutables.
5. NullPointerException
一些人认为,抛出NullPointerException异常应该当做新的“Hello World”程序来看待,因为NullPointerException是早晚会遇到的。玩笑归玩笑,这个异常的确会造成困扰,因为它经常出现在生产环境的日志中,会导致调试非常困难,因为它并不会显示原始的代码。例如,如下代码:
var name = user.getLocation().getCity().getName();
在Java 14之前,你可能会得到如下的错误:
Exception in thread "main" java.lang.NullPointerExceptionat NullPointerExample.main(NullPointerExample.java:5)
不幸的是,如果在第5行是一个包含了多个方法调用的赋值语句(如getLocation()和getCity()),那么任何一个都可能会返回null。实际上,变量user也可能是null。因此,无法判断是谁导致了NullPointerException。
在Java 14中,新的JVM特性可以显示更详细的诊断信息:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Location.getCity()" because the return value of "User.getLocation()" is nullat NullPointerExample.main(NullPointerExample.java:5)
该消息包含两个明确的组成部分:
后果:Location.getCity()无法被调用原因:User.getLocation()的返回值为null增强版本的诊断信息只有在使用下述标志运行Java时才有效:
-XX:+ShowCodeDetailsInExceptionMessages
下面是个例子:
java -XX:+ShowCodeDetailsInExceptionMessages NullPointerExample
在以后的版本中,该选项可能会成为默认。
这项改进不仅对于方法调用有效,其他可能会导致NullPointerException的地方也有效,包括字段访问、数组访问、赋值等。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!