Java Programming Style Guide für die Java 11-Ära

Der Java-Veröffentlichungszyklus hat sich geändert, und ab Januar 2019 ist die neueste Version von Java bereits 11 Jahre alt. Auch die Grammatik verbessert sich und moderne Java-Stile ändern sich. In diesem Artikel möchte ich den modernen Stil der Java-Programmierung in der Java 11-Ära zusammenfassen.

Bitte beachten Sie, dass dies wahrscheinlich die Subjektivität des Autors beinhaltet.

var (Typinferenz lokaler Variablen)

Die in Java 10 eingeführte Typdeklaration lokaler Variablen durch var, aber im Grunde ist es gut, sie positiv zu verwenden, wenn sie verwendet werden kann. Viele moderne Sprachen verwenden ähnliche Typinferenzen, aber ich habe nicht gehört, dass dies ein Problem war.

Für gut ausgebildete Java-Programmierer gibt es einige Meinungen, dass die IDE die Typdefinition auf der linken Seite automatisch vervollständigt, so dass es nicht praktisch ist, sondern nur beim Lesen des Codes die Anzahl der Zeichen auf der linken Seite von Java Die große Anzahl weist Redundanz auf, was die Lesbarkeit erheblich beeinträchtigt.

// before
Owner owner = new Owner();
List<Pet> pets = List.of(new Pet("pochi"), new Pet("tama"));

// after
var owner = new Owner();
var pets = List.of(new Pet("pochi"), new Pet("tama"));

Das obige Beispiel ist keine große Sache, aber wenn Sie Generika einschließen, sind Java-Klassennamen in der Regel lang. Daher ist es oft einfacher zu lesen, wenn Sie "var" verwenden, um die Informationsmenge zu reduzieren.

Sammelvorgang

unmodifiable

Die Standard-Sammlungsbibliothek von Java verfügt nicht über eine unveränderliche Schnittstelle wie "ImmutableList". Sie können jedoch eine Ausnahme machen, wenn Sie versuchen, ein Element zu ändern. Um unerwartete Änderungen an Elementen zu vermeiden, ist es besser, die Teile, die unveränderlich gemacht werden können, so unveränderlich wie möglich zu machen.

//In Java 9 hinzugefügte Factory-Methoden generieren unveränderliche Sammlungen
List.of(1, 2, 3); // unmodifiable
Set.of(1, 2, 3); // unmodifiable
Map.of("keyA", "valueA", "keyB", "ValueB"); // unmodifiable

//Die Collections-Klasse bietet eine Methode, die eine unveränderliche Ansicht der Sammlung zurückgibt.
Collections.unmodifiableList(modifiableList); // unmodifiable

//Mit in Java 10 hinzugefügten Factory-Methoden können Sie auch unveränderliche Ansichten vorhandener Sammlungen erstellen
List.copyOf(modifiableList); // unmodifiable

//Java 10 fügt eine Methode zum Konvertieren in eine unveränderliche Sammlung als Stream Collector hinzu
modifiableList.stream().collect(Collectors.toUnmodifiableList());

Stream API

--Verarbeiten Sie mit der Stream-API, ohne so viel wie möglich für die Anweisung zu verwenden.

Mit dem Aufkommen der Stream-API in Java 8 ist die for-Anweisung fast verschwunden. Die deklarative Beschreibung der Stream-API ist bei guter Verwendung lesbar und leistungsfreundlich. Daher ist es am besten, die Stream-API für Erfassungsvorgänge zu verwenden, außer in Ausnahmefällen.

var beforeList = List.of("a", "b", "c");

// before
var afterList1 = new ArrayList<String>();
for (var str : beforeList) {
  afterList.add(str.toUpperCase());
}

// after
var afterList2 = beforeList
    .stream()
    .map(String::toUpperCase)
    .collect(Collectors.toList());

Null

Optional

--Wenn "null" als Rückgabewert der Methode zurückgegeben werden kann, geben Sie ihn als "optional" zurück.

Java 8 hat einen "optionalen" Typ hinzugefügt, um anzuzeigen, dass der Wert "null" sein kann. Es gibt keinen Grund, dies nicht zu verwenden. Wenn also "null" zurückgegeben werden kann, geben Sie es immer als "optionalen" Typ zurück, anstatt "null" direkt zurückzugeben.

Optional<String> getName() {
    return Optional.ofNullable(this.name);
}

Es scheint, dass "Optonal" hauptsächlich als Rückgabewert der Methode verwendet werden soll, daher ist es grundsätzlich besser, es nicht im Argument oder Feld der Methode zu verwenden.

Nullability

--null Die Möglichkeit wird durch eine Anmerkung ausgedrückt.

Einer der Vorteile der Einführung von Kotlin besteht darin, dass es null-sicher ist, aber Java verfügt auch über einen Mechanismus, um es teilweise zu realisieren. Dies ist eine Deklaration der Null-Möglichkeit durch Annotation. Dies ist ein weit verbreiteter Mechanismus, der jedoch die Einführung einer Bibliothek eines Drittanbieters erfordert, da diese nie als Java-Standardfunktion übernommen wurde.

Wenn Sie beispielsweise die vom Spring Framework seit Version 5 bereitgestellten Anmerkungen verwenden, sind die folgenden Ausdrücke möglich.

public @Nullable Pet getPetByName(@NonNull String name) {
    //Übergeben Sie nicht null für den Argumentnamen
    //Rückgabewert Pet kann null sein (normalerweise optional)<Pet>Ist besser)
}

Dadurch kann die IDE im Voraus statisch nach möglichen Nullen suchen. j1WaTnvg.png

Übrigens, selbst wenn Java-Code von Kotlin verwendet wird, besteht der Vorteil, dass durch Hinzufügen dieser Anmerkungen festgestellt wird, dass es sich um einen nicht zulässigen Nulltyp handelt.

Referenz)

Objects.requireNonNull

--Method null Nicht zulässige Argumente werden zu einem frühen Zeitpunkt mit der Methode Objects.requireNonNull auf null überprüft.

Eine Annotation, die auf Nullability hinweist, kann bis zu einem gewissen Grad verhindern, dass Nullen eingemischt werden. Da es sich jedoch nur um eine statische Analyse handelt, ist es machtlos, wenn zur Laufzeit Nullen eingemischt werden. Um eine Nullkontamination zur Laufzeit frühzeitig zu erkennen, ist schließlich eine Nullprüfung innerhalb der Methode erforderlich.

Mit dem in Java 7 eingeführten Objects.requireNonNull können Sie eine präzise Nullprüfung durchführen. Daher ist es eine gute Idee, diese aktiv zu verwenden.

Pet(@NonNull String name, @NonNull LocalDate birthdate) {
    this.name = Objects.requireNonNull(name);
    this.birthdate = Objects.requireNonNull(birthdate);
}

Übrigens zeigt IntelliJ automatisch die Option an, sie in Objects.requireNonNull einzuschließen, indem Sie Option + Eingabetaste für die Variable mit einer Anmerkung wie @ NonNull drücken. Verwenden Sie diese Option. Es ist effizient zu tun. aaa

try-with-resources

In Java 7 wurde ein Mechanismus zum Testen mit Ressourcen eingeführt, um das Schließen von Ressourcen zu vereinfachen. Für Ressourcen wie Datenbankverbindungen, die unabhängig vom Erfolg oder Misserfolg der Verarbeitung immer eine enge Verarbeitung erfordern, ist es immer besser, den Try-with-Resource-Mechanismus zu verwenden, um eine enge Verarbeitung durchzuführen.

// before
FileInputStream inputStream1 = null;
try {
  inputStream1 = new FileInputStream("foo.txt");
  inputStream1.read();
} finally {
  if (inputStream1 != null) {
    try {
      inputStream1.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

// after
try (var inputStream2 = Files.newInputStream(Path.of("foo.txt"))) {
  inputStream2.read();
}

Datum (und Uhrzeit

--Verwenden Sie die Datums- und Uhrzeit-API.

Die in Java 8 eingeführte Datums- und Uhrzeit-API ersetzt jetzt fast alle alten Datums-, Kalender- und SimpleDateFormatter-Klassen. Sofern Sie keinen bestimmten Grund haben, sollten Sie die alte Klasse nicht verwenden.

// before
var date = new Date();
var simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
System.out.println(simpleDateFormat.format(date));

// after
var localDate = LocalDate.now();
var dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
System.out.println(dateTimeFormatter.format(localDate));

Man kann sagen, dass auch Bibliotheken wie Joda-Time, mit denen die Schwierigkeiten bei der Verwendung der alten Klassen beseitigt wurden, ihre Rolle beendet haben.

Dateivorgang

Mit der in Java 7 eingeführten NIO2 ist die Dateimanipulations-API von Java neu. Grundsätzlich ist es besser, die neue API zu verwenden, als die alte API so oft wie möglich zu verwenden.

// before
var dir = new File("/tmp/dir");
var succeeded = dir.mkdir();
if (succeeded) {
  try {
    new File(dir, "foo.txt").createNewFile();
  } catch (IOException e) {
    e.printStackTrace();
  }
}

// after
try {
  var directory = Files.createDirectory(Path.of("/tmp/dir2"));
  Files.createFile(directory.resolve("foo.txt"));
} catch (IOException e) {
  e.printStackTrace();
}

Versuchen Sie, "Path.of (..)" und "Files.xxx" anstelle von "new File (..)" zu verwenden.

Modul

Hinzugefügt, sobald ich verstehe ...

Recommended Posts

Java Programming Style Guide für die Java 11-Ära
Wiedereinführung in Java for Humanities 0: Den Akt der Programmierung verstehen
Einführung in Java zum ersten Mal # 2
Newcomer-Training mit der Web-Basic-Programmierung mit Java-
Über das Verfahren, damit Java funktioniert
Ich habe das neue Yuan-Problem in Java ausprobiert
Einführung des Java-Programmierhandbuchs der neuen Generation (Java 10)
Zum ersten Mal Java lernen [Einführung]
Einführung des Java-Programmierhandbuchs der neuen Generation (Java 11)
Einführung des Java-Programmierhandbuchs der neuen Generation (Java 12)
Ich habe EX25 des AtCoder Programming Guide für Anfänger (APG4b) in Java geschrieben.
Erste Programmierung in meinem Leben Java 1st Hello World
Überprüfen Sie die für den laufenden Java-Prozess festgelegten Optionen
ChatWork4j für die Verwendung der ChatWork-API in Java
Eine Geschichte über das JDK in der Java 11-Ära
Für JAVA-Lernen (2018-03-16-01)
Die Geschichte des Lernens von Java in der ersten Programmierung
Grundlagen der Java-Programmierung
Newcomer Training mit der Web-Basic Programmierung / Klassen mit Java-
Einführung des Java-Programmierhandbuchs der neuen Generation (Java-Spracherweiterungsprojekt "Amber" Edition)
Was ist der flüchtige Modifikator für Java-Variablen?
2017 IDE für Java
[Java] (für MacOS) Methode zur Einstellung des Klassenpfads
Java Generische Programmierung
Verwenden Sie vorerst eine externe Java-Bibliothek
Führen Sie jetzt Dataflow, Java, Streaming aus
Java für Anweisung
[Für Anfänger] Verstehen Sie schnell die Grundlagen von Java 8 Lambda
Ein Hinweis zum Initialisieren von Feldern im Java-Lernprogramm
Zum ersten Mal lernen Java # 3 Ausdrücke und Operatoren
Lernnotiz beim ersten Lernen von Java (persönliches Lernnotiz)
Bereiten Sie die Umgebung für Java11 und JavaFx mit Ubuntu 18.4 vor
Anmeldeinformationen, auf die das AWS SDK für Java standardmäßig verweist
Was Java-Ingenieure benötigen, um sich auf die Java 11-Version vorzubereiten
Hinweise zum Lesen des Hibernate ORM 5.3.9.Final User Guide
[Java] für Anweisung, während Anweisung
Einschränkungsprogrammierung in Java
Java 9 Ära AES 256 Chiffre
[Java] für Anweisung / erweitert für Anweisung
Gegenmaßnahmen für OutOfMemoryError in Java
Java-Programmiergrundlagen Übungsarray
Java-Programmierung (Klassenmethode)
NLP für Java (NLP4J) (2)
(Memo) Java für Anweisung
NLP für Java (NLP4J) (1)
Java-Programmierung (Klassenstruktur)
Programmiernotiz für Java-Wettbewerbe
Java Programming Thread Runnable
Ich habe [Klonmethode für Java-Arrays] als Klonmethode in Java-Arrays übersetzt.
[Java] [Java EE] [Glassfish] (Fortsetzung) Stil, der den Cache von Glassfish bezweifelt
[Für Anfänger] Über die von Java Gold erklärte JavaScript-Syntax
So wechseln Sie Java in der OpenJDK-Ära auf dem Mac
Ein Memorandum, um den juckenden Ort für Java Gold zu erreichen
Java legt die Hintergrundfarbe und das Hintergrundbild für PowerPoint-Dokumente fest