Ab Java10 können Sie mit var die Typinferenz lokaler Variablen verwenden. Obwohl es praktisch ist, kann es bei falscher Verwendung die Lesbarkeit beeinträchtigen. Daher habe ich mir überlegt, wann ich es verwenden soll. (Java 10 wurde vor mehr als einem Jahr veröffentlicht, daher ist es jetzt eine weitere Geschichte.)
Java 10 oder höher
Wenn Sie eine lokale Variable deklarieren, können Sie die Typspezifikation weglassen, indem Sie "var" schreiben, anstatt den Variablentyp anzugeben. Dies ist eine sogenannte Typinferenz.
//Traditioneller Schreibstil
String s = "hogehoge";
//Wie schreibe ich mit var
var s = "hogehoge";
//String-Klassenmethode toUpperCase()(Variable s wird als String-Typ erkannt)
System.out.println(s.toUpperCase()); // => HOGEHOGE
Egal wie lang der Modellname ist, Sie müssen nur "var" schreiben, was das Schreiben erleichtert. Außerdem sollte es leichter zu lesen sein, da keine redundanten Informationen vorhanden und ordentlich sind.
//Traditioneller Schreibstil
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd");
//Wie schreibe ich mit var
var dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd");
Der einigermaßen lange Name DateTimeFormatter ist zweimal aufgetaucht, und ich denke, es ist etwas einfacher zu schreiben und zu lesen.
Die Verwendung von var ist weiterhin statisch typisiert. Die Variable wird nicht entschlüsselt, sondern einfach automatisch eingegeben, wenn die Variable definiert wird. Sie können einer Variablen, die einmal mit var definiert wurde, keinen Wert eines anderen Typs zuweisen. (Kompilierungsfehler) [^ 1]
[^ 1]: Dies gilt natürlich nicht für zuweisungskompatible Typen wie Unterklassen.
//Da die rechte Seite ein String-Literal ist, ist die Variable s automatisch vom Typ String
var s = "hogehoge";
//Da s ein String ist, können Sie keinen Wert eines anderen Typs wie int zuweisen.
s = 123;
//Error:
//Inkompatibler Typ:int java.lang.Kann nicht in String konvertiert werden:
// s = 123;
// ^-^
Es ist auch ein Kompilierungsfehler, wenn der Typ beim Definieren einer Variablen mit var nicht von rechts eindeutig angegeben werden kann.
//Kompilierungsfehler, da null nicht weiß, um welchen Typ es sich handelt
var v = null;
//Error:
//Der Typ der lokalen Variablen v kann nicht abgeleitet werden
// (Variabler Initialisierer'null'ist)
// var v = null;
// ^-----------^
Es ist völlig anders als JavaScript var usw., also versteh mich nicht falsch.
Sie wissen, was var ist. (vielleicht) Von hier aus werden wir, wie der Titel schon sagt, überlegen, wann var verwendet werden soll und wann nicht.
Mit einem Wort, es ist ein Fall, in dem Sie auf einen Blick erkennen können, welchen Typ Sie haben, indem Sie auf die rechte Seite schauen. Insbesondere werden die folgenden Fälle angenommen.
//Da der Modellname so geschrieben ist, wie er auf der rechten Seite steht, können Sie auf einen Blick sehen, um welchen Typ es sich handelt
var date = new Date();
var scanner = new Scanner(System.in);
var list = new ArrayList<String>();
//Da die rechte Seite ein Zeichenfolgenliteral ist, können Sie auf einen Blick erkennen, dass es sich um einen Zeichenfolgentyp handelt
var s = "hogehoge";
//Da die rechte Seite ein ganzzahliges Literal ist, können Sie auf einen Blick erkennen, dass es sich um einen int-Typ handelt
var n = 123;
//Sie können erkennen, dass der Methodenname den Typnamen enthält
var br = Files.newBufferedReader(Paths.get("filename"));
//Es erhält das aktuelle Datum und die aktuelle Uhrzeit. Da es sich jedoch um eine statische Methode von LocalDateTime handelt, kann davon ausgegangen werden, dass es sich um einen LocalDateTime-Typ handelt.
var date = LocalDateTime.now();
//Da Sie eine Instanz von Calendar erhalten, können Sie davon ausgehen, dass es sich um einen Kalendertyp handelt.
var cal = Calendar.getInstance();
Das Gegenteil davon, wann Sie var verwenden sollten, kurz gesagt, wenn Sie eine Methode aufrufen, die den Rückgabetyp nicht genau erraten kann, selbst wenn Sie auf die rechte Seite schauen.
// Date#getTime()
//Da es verschiedene Typen gibt, die Datumsangaben darstellen, können Sie nicht nur anhand der "Zeit" erkennen (tatsächlich handelt es sich um einen langen Typ).
var time = date.getTime();
// Path#getFileName()
//Ist es ein String, weil es ein Dateiname ist? (Eigentlich Pfadtyp)
var filename = path.getFileName();
// File#getAbsolutePath()
//Da es einen Pfad gibt, ist dies auch ein Pfadtyp? (Eigentlich String-Typ)
var path = file.getAbsolutePath();
// Files#copy(Path, OutputStream)
//Ich habe etwas erhalten, weiß aber nicht, was es ist. Es sieht aus wie ein numerischer Wert, also int? (Tatsächlich ein langer Typwert, der die Anzahl der kopierten Bytes darstellt.)
var size = Files.copy(path, out);
In Kombination mit einer anonymen Klasse können Sie eine Methode definieren, die nur innerhalb einer bestimmten Methode gültig ist. Es hat nichts mit dem Hauptthema zu tun, aber ich werde es schreiben, weil es nützlich sein kann.
Main.java
public class Main {
public static void main(String[] args) {
// func.capitalize()Kann mit angerufen werden
//func ist eine lokale Variable und kann von außerhalb dieser Methode nicht aufgerufen werden
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