Guide de style de programmation Java pour l'ère Java 11

Le cycle de publication de Java a changé et, depuis janvier 2019, la dernière version de Java date de 11. Les améliorations de la grammaire progressent également et les styles Java modernes changent. Dans cet article, je voudrais résumer le style moderne de la programmation Java à l'ère de Java 11.

Veuillez noter qu'il inclut probablement la subjectivité de l'auteur.

var (inférence de type de variables locales)

La déclaration de type des variables locales par var introduite dans Java 10, mais en gros, il est bon de l'utiliser de manière positive quand elle peut être utilisée. De nombreuses langues modernes utilisent une inférence de type similaire, mais je n'ai pas entendu dire que c'était un problème.

Pour les programmeurs Java hautement qualifiés, il y a une opinion que l'EDI complète automatiquement la définition de type sur le côté gauche, donc ce n'est pas pratique, mais seulement lors de la lecture du code, le nombre de caractères sur le côté gauche de Java Il existe une redondance dans le grand nombre qui nuit considérablement à la lisibilité.

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

L'exemple ci-dessus n'est pas un gros problème, mais les noms de classe Java ont tendance à être longs si vous incluez des génériques, il est donc souvent plus facile à lire si vous utilisez var pour réduire la quantité d'informations.

Opération de collecte

unmodifiable

La bibliothèque de collection standard de Java n'a pas d'interface immuable comme ʻImmutableList`, mais vous pouvez faire une exception lorsque vous essayez de changer un élément. Afin d'éviter des changements inattendus d'éléments, il est préférable de rendre les parties qui peuvent être rendues immuables aussi immuables que possible.

//Les méthodes d'usine ajoutées dans Java 9 génèrent des collections immuables
List.of(1, 2, 3); // unmodifiable
Set.of(1, 2, 3); // unmodifiable
Map.of("keyA", "valueA", "keyB", "ValueB"); // unmodifiable

//La classe Collections fournit une méthode qui renvoie une vue immuable de la collection.
Collections.unmodifiableList(modifiableList); // unmodifiable

//Les méthodes d'usine ajoutées dans Java 10 vous permettent également de créer des vues immuables des collections existantes
List.copyOf(modifiableList); // unmodifiable

//Java 10 ajoute une méthode pour convertir en une collection immuable en tant que Stream Collector
modifiableList.stream().collect(Collectors.toUnmodifiableList());

Stream API

--Processer par l'API Stream sans utiliser l'instruction for autant que possible.

Avec l'avènement de l'API Stream dans Java 8, l'instruction for a presque disparu. La description déclarative de l'API Stream est lisible et conviviale lorsqu'elle est bien utilisée, il est donc préférable d'utiliser l'API Stream pour les opérations de collecte, sauf dans des cas exceptionnels.

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

--Si null peut être retourné comme valeur de retour de la méthode, renvoyez-le comme type ʻOptional`.

Java 8 a ajouté le type ʻOptional pour indiquer que la valeur peut être null. Il n'y a aucune raison de ne pas l'utiliser, donc si null peut être retourné, retournez-le toujours comme type ʻOptional au lieu de renvoyer null directement.

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

Il semble que ʻOptonal` soit principalement censé être utilisé comme valeur de retour de la méthode, il vaut donc mieux ne pas l'utiliser dans l'argument ou le champ de la méthode.

Nullability

--null La possibilité est exprimée par une annotation.

L'un des avantages de l'introduction de Kotlin est qu'il est sans danger pour les valeurs nulles, mais Java dispose également d'un mécanisme pour le réaliser partiellement, qui est une déclaration de possibilité nulle par annotation. Il s'agit d'un mécanisme largement utilisé, bien qu'il nécessite l'introduction d'une bibliothèque tierce car il n'a jamais été adopté en tant que fonctionnalité standard Java.

Par exemple, en utilisant les annotations fournies par Spring Framework à partir de la version 5, les expressions suivantes sont possibles.

public @Nullable Pet getPetByName(@NonNull String name) {
    //Ne passez pas null pour le nom de l'argument
    //La valeur de retour Pet peut être nulle (généralement facultative)<Pet>Est mieux)
}

Cela permet à l'EDI de vérifier statiquement d'éventuelles valeurs nulles à l'avance. j1WaTnvg.png

À propos, même lors de l'utilisation du code Java de Kotlin, il y a un avantage à déterminer qu'il s'agit d'un type non autorisé null en ajoutant ces annotations.

référence)

Objects.requireNonNull

--Method null Les arguments non autorisés sont vérifiés pour null à un moment précoce en utilisant la méthode ʻObjects.requireNonNull`.

Une annotation qui indique Nullability peut empêcher les valeurs nulles d'être mélangées dans une certaine mesure, mais comme il ne s'agit que d'une analyse statique, elle est impuissante si les valeurs nulles sont mélangées au moment de l'exécution. Afin de détecter une contamination nulle au moment de l'exécution tôt, une vérification nulle à l'intérieur de la méthode est nécessaire après tout.

Avec ʻObjects.requireNonNull` introduit dans Java 7, vous pouvez effectuer une inspection nulle de manière concise, c'est donc une bonne idée de l'utiliser activement.

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

Au fait, avec IntelliJ, si vous appuyez sur Option + Entrée sur une variable avec une annotation telle que @ NonNull, l'option qui l'englobe automatiquement dans ʻObjects.requireNonNull` sera affichée, alors utilisez ceci. C'est efficace à faire. aaa

try-with-resources

--Utilisez try-with-resources partout où des ressources doivent être fermées.

Java 7 a introduit un mécanisme d'essai avec les ressources pour faciliter la fermeture des ressources. Pour les ressources qui doivent être fermées indépendamment de la réussite ou de l'échec du processus, telles que les connexions à la base de données, il est toujours préférable d'utiliser le mécanisme try-with-resource pour effectuer le processus de fermeture.

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

Date et l'heure

--Utilisez l'API de date et d'heure.

L'API Date et heure introduite dans Java 8 remplace désormais presque toutes les anciennes classes Date, Calendar et SimpleDateFormatter. Sauf si vous avez une raison spécifique, vous ne devriez pas utiliser l'ancienne classe.

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

On peut dire que des bibliothèques comme Joda-Time, qui permettait d'éliminer la difficulté d'utiliser les anciennes classes, ont également terminé leur rôle.

Opération de fichier

Avec NIO2 introduit dans Java 7, l'API de manipulation de fichiers de Java est nouvelle. Fondamentalement, il vaut mieux suivre la politique d'utilisation de la nouvelle API au lieu d'utiliser l'ancienne API autant que possible.

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

Essayez d'utiliser Path.of (..) et Files.xxx au lieu de new File (..).

module

Ajouté dès que j'ai compris ...

Recommended Posts

Guide de style de programmation Java pour l'ère Java 11
Réintroduction à Java for Humanities 0: Comprendre l'acte de programmation
Introduction à Java pour la première fois # 2
Formation des nouveaux arrivants à l'aide de la programmation Web-Basic à l'aide de Java-
À propos de la procédure pour que Java fonctionne
J'ai essayé le nouveau yuan à Java
Introduction du guide de programmation Java de nouvelle génération (Java 10)
Apprendre pour la première fois java [Introduction]
Introduction du guide de programmation Java de nouvelle génération (Java 11)
Introduction du guide de programmation Java de nouvelle génération (Java 12)
J'ai écrit EX25 du guide de programmation AtCoder pour les débutants (APG4b) en java.
Première programmation de ma vie Java 1st Hello World
Vérifiez les options définies pour le processus Java en cours d'exécution
ChatWork4j pour l'utilisation de l'API ChatWork en Java
Une histoire sur le JDK à l'ère de Java 11
Pour l'apprentissage JAVA (2018-03-16-01)
L'histoire de l'apprentissage de Java dans la première programmation
bases de la programmation Java
Formation des nouveaux arrivants à l'aide de la programmation / cours Web-Basic en
Introduction du guide de programmation Java nouvelle génération (projet d'extension du langage Java édition "Amber")
Quel est le modificateur volatile pour les variables Java?
IDE 2017 pour Java
[Java] (pour MacOS) Méthode de définition du chemin de classe
Programmation générique java
Utilisez une bibliothèque Java externe pour le moment
Exécutez Dataflow, Java, Streaming pour le moment
Java pour instruction
[Pour les débutants] Comprendre rapidement les bases de Java 8 lambda
Remarque sur l'initialisation des champs dans le didacticiel Java
Apprentissage pour la première fois des expressions et opérateurs Java # 3
Mémo d'apprentissage lors de l'apprentissage de Java pour la première fois (mémo d'apprentissage personnel)
Préparer l'environnement pour java11 et javaFx avec Ubuntu 18.4
Informations d'identification référencées par le kit AWS SDK for Java par défaut
Ce dont les ingénieurs Java ont besoin pour se préparer à la version Java 11
Remarques pour lire le Guide de l'utilisateur final Hibernate ORM 5.3.9.
[Java] pour instruction, while instruction
Programmation par contraintes en Java
Chiffrement AES 256 de l'ère Java 9
[Java] pour instruction / étendu pour instruction
Contre-mesures pour OutOfMemoryError en java
Bases de la programmation Java Practice-array
Programmation Java (méthode de classe)
PNL pour Java (NLP4J) (2)
(Mémo) Java pour instruction
PNL pour Java (NLP4J) (1)
Programmation Java (structure de classe)
Tout sur la programmation Java
mémo de programmation du concours java
Thread de programmation Java exécutable
J'ai traduit [Méthode Clone pour les tableaux Java] comme méthode Clone dans les tableaux Java.
[Java] [Java EE] [Glassfish] (suite) Style qui met en doute le cache de Glassfish
[Pour les débutants] À propos de la syntaxe JavaScript expliquée par Java Gold
Comment changer Java à l'ère d'OpenJDK sur Mac
Un mémorandum pour atteindre le lieu qui démange pour Java Gold
Java définit la couleur et l'image d'arrière-plan des documents PowerPoint