[Java] Points à noter sur l'inférence de type étendue dans Java 10

6qwm567z1m.jpg

[Swift](https://ja.wikipedia.org/wiki/Swift_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3 % 83% B3% E3% 82% B0% E8% A8% 80% E8% AA% 9E)), Scala, [Kotlin](https :: //ja.wikipedia.org/wiki/Kotlin), [Aller](https://ja.wikipedia.org/wiki/Go_(%E3%83%97%E3%83%AD%E3%82%B0 % E3% 83% A9% E3% 83% 9F% E3% 83% B3% E3% 82% B0% E8% A8% 80% E8% AA% 9E )), [Rust](https: // ja. wikipedia.org/wiki/Rust_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0 Ceux qui développent avec% E8% A8% 80% E8% AA% 9E)) seront familiarisés avec ce que l'on appelle "l'inférence de type". L'inférence de type est une fonction de langage dans les langages à typage statique, et le compilateur détermine automatiquement le type sans décrire explicitement le type, donc comme l'inférence de type de Kotlin,

var a = 1

Juste en écrivant, le compilateur déduira automatiquement du type sur le côté droit que la variable a sur le côté gauche est un type entier. Enfin, même en Java, le fait que "l'inférence de type de variables locales" soit dérivée de Java 10 était un nouvel événement dans ma mémoire.

Par exemple, avant Java 10, il était nécessaire d'écrire explicitement le type de variable comme suit:

String name = "tamito0201";

Dans Java 10, vous pouvez supprimer les types explicites requis dans les déclarations de variables locales en ajoutant le mot-clé var comme suit:

var name = "tamito0201";

Dans le cas ci-dessus, vous ne ressentirez peut-être pas beaucoup d'avantages car String est simplement remplacé par var. Cependant, dans le cas de Java, lorsque vous utilisez l'API de collecte, vous devez écrire du code fastidieusement redondant.

HashMap<Integer, String> map = new HashMap<Integer, String>();

Dans Java 10 ou version ultérieure, ce

var map = new HashMap<Integer, String>();

Cela peut être décrit comme. Comme c'est élégant!

Cependant, bien que l'inférence de type soit pratique, c'est aussi une arme à double tranchant qui crée des bogues inattendus. Par conséquent, en fonction du projet, certains projets interdisent la spécification de var par la norme de codage et spécifient explicitement le type. Plus le projet est volumineux, plus le typage explicite à l'ancienne est effectué, compte tenu du risque de créer des bogues inattendus.

Pourquoi? Par exemple, supposons que vous ayez le code suivant:

var distance = getDistance();
System.out.println(distance * 100);

Quelle est la valeur de retour de la fonction getDistance? Ceux qui ont un sens aigu des sentiments ont peut-être remarqué ici. C'est vrai. S'il existe une possibilité de renvoyer l'objet wrapper Integer, null peut être renvoyé. En conséquence, il est évident que nullpo se produira à la prochaine distance * 100, vous devez donc vérifier null.

Integer distance = getDistance();
if (distance != null) {
    System.out.println(distance * 100);
}

Dans Java 8 ou version ultérieure, vous devez renvoyer Facultatif.

Optional<Integer> distance = Optional.ofNullable(getDistance());
distance.ifPresent(d -> System.out.println(d * 100));

En d'autres termes, puisque var est utilisé correctement par le projet ou l'équipe, il est nécessaire de décider de la directive de codage.

--Ne pas utiliser var

Tous sont corrects, mais en réalité 1 ou 2 est considéré comme approprié. Peu importe combien vous spécifiez le type spécifié dans la norme de codage, il est peu probable que tous les ingénieurs se conforment à la norme de codage dans un projet à grande échelle. Déterminé par la norme de codage, Checkstyle, SpotBugs, [PMD](https: // pmd) Je pense qu'il vaut mieux le lier avec .github.io /) etc.

Tout a ses avantages et ses inconvénients.

Assurez-vous de décider quoi faire de ce domaine dans votre projet. Si vous ne décidez pas, la source du projet terminé sera le chaos.

Recommended Posts

[Java] Points à noter sur l'inférence de type étendue dans Java 10
Points à noter dans les expressions conditionnelles
[Java Siler] À propos de l'inférence de type par var
[Introduction à Java] À propos de la conversion de type (distribution, promotion)
À propos de var utilisé en Java (type de variable locale)
Points à connaître avec Java Equals
Détermination de type en Java
java: Comment écrire une liste de types génériques [Note]
Points à surveiller dans le développement futur de Java
Remarques sur Java GC
Essayez le type fonctionnel en Java! ①
À propos de la classe abstraite Java
Éléments à prendre en compte lors de l'écriture de code en Java
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
[Introduction à Java] À propos des expressions lambda
Multithread pour s'adapter au modèle [Java]
[Introduction à Java] À propos de l'API Stream
Comment apprendre JAVA en 7 jours
Précautions lors de l'utilisation de Spring AOP avec les classes de ressources Jersery
Enregistrer la sortie dans un fichier en Java
Ma note de profit: Présentation de Java à Ubuntu
Comment utiliser les classes en Java?
Comment nommer des variables en Java
A propos du traitement de la copie de fichiers en Java
Essayez d'implémenter Yuma en Java
Choses à noter pour les nouveaux arrivants d'écrire du code lisible pendant le développement Java
Comment utiliser le type enum Java
Comment concaténer des chaînes avec Java
Exemple de code pour obtenir les valeurs de type JDBC clés dans la base de données Java + H2
Raison pour ajouter L au nombre à mettre en type long Java
A propos du renvoi d'une référence dans un Java Getter
Comment implémenter le calcul de la date en Java
Comment implémenter le filtre de Kalman par Java
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
Concernant la comparaison d'équivalence de type de chaîne en Java
Essayez de résoudre Project Euler en Java
[Explication facile à comprendre! ] Conversion de type de type de référence en Java
Facile à créer Slack Bot avec Java
Référence Java à comprendre dans la figure
Mémo pour avoir plusieurs valeurs dans HashMap
Essayez d'implémenter l'ajout n-aire en Java
À propos de la procédure pour que Java fonctionne
[Création] Un mémorandum sur le codage en Java
Comment faire une conversion de base en Java
Diverses choses comme les indicateurs de bits en Java
[Java] Convertit null du type Object en type String
Remplacez List <Optional <T >> par Optional <List <T >> en Java
Date de sortie en Java au format étendu ISO 8601
À propos des enregistrements ajoutés pour l'aperçu dans Java JDK 14
Comment appliquer les conventions de codage en Java
Comment intégrer Janus Graph dans Java
Comment utiliser la classe Java Scanner (Remarque)
[Connaissance de base de Java] À propos de la conversion de type
Comment obtenir la date avec Java
Discussion continue sur l'écriture de Java avec Emacs @ 2018
Ajouter des notes de bas de page aux documents Word en Java
[Java Bronze] 5 problèmes à garder à l'esprit
Exemple pour décompresser le fichier gz en Java
Conversion de type du type java Big Decimal au type String