[Java] Wann var verwendet werden soll und wann nicht

Überblick

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.)

Betriebsumgebung

Java 10 oder höher

Was ist überhaupt var?

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

Worüber freust du dich?

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.

Nicht dynamisch getippt!

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.

Ob var verwendet werden soll

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.

Wann wird var verwendet?

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.

Beim Instanziieren auf der rechten Seite

//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>();

Wenn die rechte Seite wörtlich ist

//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;

Beim Aufrufen einer Methode, die den Rückgabetyp auf der rechten Seite leicht erraten kann

//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();

Wenn Sie var nicht verwenden sollten

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);

Bonus

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
    }
}

Zusammenfassung

Referenzlink

Recommended Posts

[Java] Wann var verwendet werden soll und wann nicht
Map keySet, Werte sollten nicht verwendet werden
[Java10] Achten Sie darauf, var und generics nicht zusammen zu verwenden
Syntax- und Ausnahmebedingungen, die beim Vergleich mit null in Java verwendet werden können
Feder sollte vermutet werden, wenn Rails-Befehle nicht richtig funktionieren
Warum Java Vector nicht verwendet wird
Java Jshell und Var sind zu empfehlen!
[Rails] [Hinweis] Wann = zu <%%> hinzugefügt werden soll und wann nicht
[NetBeans] Story, wenn sie nicht gestartet wird
[Java] Wenn Sie das URL-Format mit Bean Validation überprüfen, ist es möglicherweise besser, @URL von Hibernate Validator nicht zu verwenden.
[CentOS8] Da der Befehl javac nicht verwendet werden konnte, installieren Sie die Java-Entwicklungsumgebung.
Seien Sie vorsichtig mit Anfragen und Antworten, wenn Sie das Serverless Framework mit Java verwenden
ValidationMessages.properties sollte im Klassenpfad nicht mehrfach sein
Gekitsuyo Rest Template sollte für die REST-Kommunikation verwendet werden
Dinge, die Sie beim Schreiben von Java beachten sollten
Java switch Anweisung und break, Kotlin beim Ausdruck ...
Informationen zu in Java verwendeten Variablen (lokaler Variablentyp)
Java Servlet sollte die Multithread-Umgebung kennen
Warum der Klassenvergleich vom Typ Java String (==) nicht verwendet werden kann
[Java] Vorsichtsmaßnahmen beim Referenzieren in einer übergeordneten Klasse und beim Instanziieren in einer untergeordneten Klasse
Die Geschichte, dass die vom Java-Konstruktor aufgerufene Methode zur Variableninitialisierung nicht überschrieben werden sollte