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
.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.
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.
Ü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.
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();
}
--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.
java.nio.file
(NIO2) gegenüber der Paketklasse java.io
(Java I / O).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.
Hinzugefügt, sobald ich verstehe ...
Recommended Posts