1. Sucre syntaxique
Les programmeurs aiment quand un code ou une logique complexe peut être écrit en quelques lignes, ce qui rend le code compact et lisible. Et les créateurs de langages de programmation y contribuent parfois.
Une fonctionnalité de langage astucieuse qui vous permet de prendre un raccourci (écrire moins de code) est appelée sucre syntaxique . Mais, pour être honnête, il y en a très peu à Java.
Les créateurs de Java ont tout fait pour éliminer toute redondance dans Java. Si C++ vous permet de faire quelque chose de 20 façons, alors Java ne vous permet de le faire que d'une seule façon.
Mais ni les programmeurs Java ni les créateurs de Java n'aimaient le manque de liberté. Et parfois, le sucre facilite la vie des gens ordinaires comme vous et moi.
Au fait, vous avez déjà rencontré du sucre syntaxique : autoboxing et unboxing . Comparons:
Code long | Code compact |
---|---|
|
|
|
|
|
|
Au lieu du code long comme à gauche, vous pouvez écrire le code plus compact à droite. Et le compilateur Java intelligent générera la version détaillée du code basée sur la version courte du code. C'est exactement ce qu'est le sucre syntaxique.
2. Inférence du type d'une variable : le var
mot clé
Dans Java 11, le compilateur est devenu encore plus intelligent et peut désormais déterminer le type d'une variable déclarée en fonction du type de la valeur qui lui est affectée . En code, ça ressemble à ça :
var name = value;
Où name
est le nom d'une nouvelle variable, valeur est sa valeur initiale et var
est un mot-clé utilisé pour déclarer la variable. Le type de la variable name sera le même que le type de la valeur qui lui est assignée.
Exemples:
Comment nous voyons le code | Ce que voit le compilateur |
---|---|
|
|
|
|
|
|
|
|
|
|
Le compilateur lui-même détermine, ou déduit, le type de la variable en fonction de la valeur qui lui est assignée.
Les programmeurs ont vivement débattu de l'opportunité d'ajouter une telle fonctionnalité au langage. Beaucoup de gens craignaient que cela var
ne soit abusé et que la lisibilité du code en pâtisse.
Il y a un grain de vérité là-dedans, il est donc préférable de l'utiliser var
là où cela augmente la lisibilité du code. Par exemple, ceux-ci dans deux cas :
Cas 1 : En regardant la valeur attribuée à la variable, le type de la variable est immédiatement clair
Code | Explication |
---|---|
|
La variable est uneInputStream |
|
La variable est uneString |
Dans ces cas, vous ne devriez pas utiliser var
. Eh bien, quel est le type de la variable ?
Code | Explication |
---|---|
|
Il est difficile de déterminer le type de la variable |
|
Il est difficile de déterminer le type de la variable |
Cas 2 : Le type de la variable n'est pas important pour la compréhension du code
Le code n'a souvent pas besoin d'appeler des méthodes sur une variable, par exemple lorsqu'une variable est simplement utilisée pour stocker temporairement quelque chose. Dans ce cas, l'utilisation var
ne réduit définitivement pas la lisibilité du code :
Code long | Code compact |
---|---|
|
Nous avons obtenu les métadonnées du stream flux et les avons enregistrées dans le storage référentiel. Le data type spécifique de la variable n'est pas important. |
Le juste milieu
Je vais maintenant donner trois façons d'écrire le même code. L'utilisation var
serait la meilleure option.
Code | Note |
---|---|
|
Trop compact |
|
Juste à droite |
|
Trop détaillé |
En passant de la version avec 1 ligne à la version sur 2 lignes, nous avons rendu le code un peu plus lisible en utilisant un nom de variable ( headerInfo
). Il est maintenant clair que la méthode renvoie non seulement des méta-informations, mais également des informations d'en-tête.
La troisième version est trop verbeuse. Le fait que headerInfo
soit a FileMetaInfo
ressort déjà assez clairement de la getFileMetaInfo()
méthode. Le but des méta-informations est beaucoup plus intéressant.
3. Omettre le type avec l'opérateur losange :<>
Même avant l' var
apparition de l'opérateur, il y a eu des tentatives pour apprendre au compilateur comment déduire les types de collection. Vous conviendrez que cette notation semble un peu redondante :
ArrayList<String> list = new ArrayList<String>();
À partir de la septième version de Java, lors de l'écriture d'un type de collection, vous pouvez omettre le type des éléments de la collection s'il a été spécifié lors de la déclaration d'une variable. En d'autres termes, le code ci-dessus peut être écrit sous une forme légèrement abrégée :
ArrayList<String> list = new ArrayList<>();
Comme vous pouvez le voir, vous n'avez plus besoin d'écrire String une seconde fois. Pas aussi cool qu'avec l'opérateur var, mais cela semblait être un progrès à l'époque.
Les crochets vides dans le type de collection étaient appelés l' opérateur diamant , puisque les deux crochets ressemblent vaguement à un diamant.
Il n'est pas souhaitable d'utiliser le var
mot clé et l' opérateur diamant en même temps :
var list = new ArrayList<>();
Il n'y a aucune information sur le type des éléments stockés dans la collection, et le type de collection sera ArrayList < Object >.
4. Doubles accolades
Vous souvenez-vous de l'initialisation rapide du tableau ?
Nous venons de lister les valeurs entre accolades, comme ceci :
Exemples |
---|
|
|
Les créateurs de Java ont adoré l'idée d'utiliser des accolades pour simplifier l'écriture des éléments d'un tableau. Mais qu'en est-il des collections ?
Les créateurs de Java avaient également suffisamment de créativité pour les collections, leur permettant d'utiliser une astuce avec des accolades doubles.
Avec du sucre | Sans sucre |
---|---|
|
|
Si le compilateur rencontre du code comme dans l'exemple de gauche, il le convertit en code de droite.
Le code ne devient pas beaucoup plus compact. Les économies ici sont assez insignifiantes : vous n'avez pas à écrire list
à chaque fois. Cela peut être utile si le nom de la variable est très long.
Mais si vous rencontrez un code comme celui-ci dans un projet, ne soyez pas surpris 🙂
GO TO FULL VERSION