À partir de Java 10, vous pouvez utiliser l'inférence de type de variable locale à l'aide de var. Bien que cela soit pratique, cela peut réduire la lisibilité s'il n'est pas utilisé correctement, j'ai donc réfléchi au moment de l'utiliser. (Java 10 est sorti il y a plus d'un an, c'est donc une autre histoire maintenant)
Java 10 ou version ultérieure
Lors de la déclaration d'une variable locale, vous pouvez omettre la spécification de type en écrivant "var" au lieu de spécifier le type de variable. C'est ce qu'on appelle l'inférence de type.
//Style d'écriture traditionnel
String s = "hogehoge";
//Comment écrire avec var
var s = "hogehoge";
//Méthode de classe String toUpperCase()(La variable s est reconnue comme de type chaîne)
System.out.println(s.toUpperCase()); // => HOGEHOGE
Quelle que soit la longueur du nom du modèle, tout ce que vous avez à faire est d'écrire "var", ce qui facilite l'écriture. Il devrait également être plus facile à lire car il élimine les informations redondantes et est soigné.
//Style d'écriture traditionnel
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd");
//Comment écrire avec var
var dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd");
Le nom assez long DateTimeFormatter est apparu deux fois, et je pense que c'est un peu plus facile à écrire et à lire.
L'utilisation de var est toujours typée statiquement. La variable n'est pas détypée, elle est simplement typée automatiquement lorsque la variable est définie. Vous ne pouvez pas réaffecter une valeur d'un autre type à une variable une fois définie avec var. (Erreur de compilation) [^ 1]
[^ 1]: Bien sûr, cela ne s'applique pas aux types compatibles avec l'affectation tels que les sous-classes.
//Puisque le côté droit est un littéral de chaîne, la variable s est automatiquement de type String
var s = "hogehoge";
//Puisque s est une chaîne, vous ne pouvez pas affecter une valeur d'un autre type tel que int.
s = 123;
//Erreur:
//Type incompatible:int java.lang.Impossible de convertir en chaîne:
// s = 123;
// ^-^
Il s'agit également d'une erreur de compilation si le type ne peut pas être spécifié de manière unique depuis le côté droit lors de la définition d'une variable avec var.
//Erreur de compilation car null ne sait pas de quel type il s'agit
var v = null;
//Erreur:
//Impossible de déduire le type de variable locale v
// (Initialiseur variable'null'est)
// var v = null;
// ^-----------^
C'est complètement différent de JavaScript var etc., alors ne vous méprenez pas.
Vous savez ce qu'est var. (peut être) À partir de là, comme le titre l'indique, nous examinerons quand utiliser var et quand ne pas l'utiliser.
En un mot, c'est un cas où vous pouvez dire en un coup d'œil quel type vous avez en regardant le côté droit. Plus précisément, les cas suivants sont supposés.
//Puisque le nom du modèle est écrit tel quel sur le côté droit, vous pouvez voir de quel type il s'agit en un coup d'œil
var date = new Date();
var scanner = new Scanner(System.in);
var list = new ArrayList<String>();
//Puisque le côté droit est un littéral de chaîne de caractères, vous pouvez voir en un coup d'œil qu'il s'agit d'un type String
var s = "hogehoge";
//Puisque le côté droit est un littéral entier, vous pouvez voir en un coup d'œil qu'il s'agit d'un type int
var n = 123;
//Vous pouvez le dire car le nom de la méthode contient le nom du type
var br = Files.newBufferedReader(Paths.get("filename"));
//Obtenez la date et l'heure actuelles, mais comme il s'agit d'une méthode statique de LocalDateTime, vous pouvez deviner qu'il s'agit d'un type LocalDateTime.
var date = LocalDateTime.now();
//Puisque vous obtenez une instance de calendrier, vous pouvez deviner qu'il s'agit d'un type de calendrier.
var cal = Calendar.getInstance();
Le contraire de quand var doit être utilisé, en un mot, lors de l'appel d'une méthode dont le type de retour ne peut pas être déduit avec précision en regardant le côté droit.
// Date#getTime()
//Puisqu'il existe différents types qui représentent des dates, vous ne pouvez pas le dire uniquement par "Heure" (en fait, c'est un type long).
var time = date.getTime();
// Path#getFileName()
//Est-ce une chaîne parce que c'est un nom de fichier? (En fait, type de chemin)
var filename = path.getFileName();
// File#getAbsolutePath()
//Puisqu'il existe un chemin, est-ce également un type de chemin? (En fait de type chaîne)
var path = file.getAbsolutePath();
// Files#copy(Path, OutputStream)
//J'ai reçu quelque chose mais je ne sais pas ce que c'est. Cela ressemble à une valeur numérique, donc int? (En fait, une valeur de type long qui représente le nombre d'octets copiés)
var size = Files.copy(path, out);
Lorsqu'elle est utilisée en combinaison avec une classe anonyme, vous pouvez définir une méthode qui n'est valide que dans une méthode particulière. Cela n'a rien à voir avec le sujet principal, mais je vais l'écrire car cela peut être utile.
Main.java
public class Main {
public static void main(String[] args) {
// func.capitalize()Peut être appelé avec
//func est une variable locale et ne peut pas être appelée depuis l'extérieur de cette méthode
var func = new Object() {
private String capitalize(String s) {
return s.substring(0, 1).toUpperCase() + s.substring(1, s.length()).toLowerCase();
}
};
System.out.println(func.capitalize("tokyo")); // => Tokyo
System.out.println(func.capitalize("TOKYO")); // => Tokyo
}
}
Recommended Posts