Travailler comme une équipe! Face Null de front en Java

Je m'excuse d'avoir inventé la référence Null lors de la conférence 2009.

C'est mon erreur qui vaut un milliard de dollars.

Null C'est un problème haineux qui tourmente toujours les développeurs utilisant des langages non sécurisés. Informaticien [Antony Hoa | wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%83%88%E3%83%8B% Comme E3% 83% BC% E3% 83% BB% E3% 83% 9B% E3% 83% BC% E3% 82% A2) dit plus haut, c'est une dette technique tissée dans la langue. Ce n'est pas exagéré à dire.

Dans le nouveau développement moderne, les langues non sécurisées nulles ne sont plus des langues héritées | Qiita L'idée d'éviter les langues non sécurisées nulles elles-mêmes, comme dans l'article Il y aura. Cependant, il y a encore des situations où vous devez choisir une langue qui n'est pas sûre pour diverses raisons.

Donc, cette fois, je vais réfléchir à la méthode pour faire face à Null en Java.

スクリーンショット 2018-06-20 19.31.07.png

Précautions de lecture

«Le plan de contre-mesures a un« niveau de recommandation », mais c'est une impression personnelle basée sur l'expérience. ―― Le niveau de recommandation lors de l'intégration dans une équipe est affiché en 3 étapes (: star: ~: star :: star :: star :)

Mesure

JSR-305 Un groupe d'annotations défini pour Software Defect Detection en tant que spécification Java.

Par conséquent, il ne s'agit pas d'une annotation censée fonctionner dans Runtime, mais d'une spécification définie comme une ** fonction auxiliaire ** au moment du développement (par exemple, prise en charge dans les IDE tels que Find Bugs et IntelliJ).

Déclarer si le type de retour est null

Niveau de recommandation :: star :: star :: star:

import javax.annotation.Nullable;

@Nullable
public String createText() {
    // ...
import javax.annotation.Nonnull;

@Nonnull
public String createText() {
    // ...

Il est très important de pouvoir utiliser la fonction d'assistance aux chèques, mais j'ai senti que l'efficacité serait maximisée dans les points suivants lorsque l'on travaillait en équipe.

Déclarez s'il faut autoriser null dans l'argument

Niveau de recommandation :: étoile:

import javax.annotation.Nullable;
import javax.annotation.Nonnull;

public String createText(@Nonnull String id,
                         @Nullable String option) {
    // ...

Bien que les mêmes avantages que "déclarer si le type de retour est" nul "" peuvent être obtenus, les inconvénients suivants sont évidents pour l'équipe.

Java 8+ standard ʻOptional`

ʻOptional suggère null` comme type de retour

Niveau de recommandation :: étoile:

import java.util.Optional;

public Optional<String> getText() {
   // ...

Java 8 «Optionnel» est mentionné dans de nombreux articles, je n'entrerai donc pas dans les détails. Les raisons pour lesquelles nous ne le recommandons pas ici sont les suivantes.

■ Référence

Programmation de représentation

«Programmation d'expression» qui vérifie les conditions préalables introduites dans Master Programmer. C'est très précieux car cela vous permet de laisser le "concept de niveau supérieur" du concepteur / implémenteur sous forme de code.

Tester les hypothèses du programme avec ʻassert`

Niveau de recommandation :: star :: star:

private String createText(String id) {
    assert (id != null) : "id must not be null.";
    // ...

Un exemple typique de programmation express en Java est ʻassert`. Cependant, vous devez être conscient des points suivants dans le code (Programming with assertions | oracle.com Extrait de assert.html)

■ Activer et désactiver les assertions ** Par défaut, les assertions sont désactivées ** au moment de l'exécution. Vous pouvez utiliser deux commutateurs de ligne de commande pour activer / désactiver les assertions. Utilisez les assertions -enable ou -ea pour activer les assertions à différents niveaux de détail.

On peut lire que ʻassert` est juste un moyen auxiliaire pour la déclaration d'intention de l'implémenteur, pas pour lever une exception dans le Runtime du code produit. De plus, si vous lisez attentivement le document officiel, il contiendra des informations importantes telles que les traitements qui ont des effets secondaires, vous devez donc réfléchir attentivement aux points à utiliser lors de l'adoption.

Tirer parti des assertions de la bibliothèque

Niveau de recommandation :: star :: star :: star:

import org.springframework.util.Assert;

public String createText(String id) {
    Assert.notNull(id, "ID must not be null.");
    // ...

Pour Spring Framework ʻorg.springframework.util.Assert` L'utilisation est-ce.

Contrairement à Java Assertion, il déclenche une exception même au Runtime. C'est une simplification de la vérification des null, mais cela fonctionne également avec Runtime, vous pouvez donc laisser une déclaration d'intention très forte pour l'implémenteur dans votre code.

Défense indirecte «nulle»

Déclarez la variable finale pour la rendre immuable

Niveau de recommandation :: star :: star:

public String createText(final String id) {
    // ...
public String createText(String id) {
    final String prefix = something(id);
    // ...

L'utilisation de «final» ne semble pas être directement liée à «null». Cependant, en combinaison avec la garantie non-«nul» dans Assertion, vous pouvez presque complètement garantir non-nul »dans votre propre méthode. En conséquence, vous pouvez supprimer en toute confiance les traitements inutiles tels que "Je ne sais pas ce qui va arriver, alors vérifiez" null "pour le moment" dans le traitement intermédiaire.

Rendre la collection immuable

Niveau de recommandation :: star :: star:

Norme Java
import java.util.Collections;

public String createText() {
    List immutables = Collections.singletonList("value1", "value2");
    // ...
import java.util.Collections;

public String createText() {
    Map<String, String> immutables = Collections.singletonMap("key1", "value1");
    // ...
import java.util.Collections;

public List<Store> fetchStores() {
   List<Store> stores  = findAll();
   
   return Collections.unmodifiableCollection(stores);

Guava

import com.google.common.collect.ImmutableMap;

public String createText() {
    Map<String, String> immutables = ImmutableMap.of("key1", "value1", "key2", "value2");
    // ...
import com.google.common.collect.ImmutableList;

public String createText() {
    List<String> immutables = ImmutableList.of("value1", "value2");
    // ...

C'est une défense assez locale en ce qui concerne les collections immuables.

Cela réduit le risque de mélanger des éléments "null" dans une collection une fois créée, dans le but de prendre en charge les exceptions "null" lors du traitement intermédiaire ultérieur. C'est sobre, mais il devrait être incorporé autant que possible.

exemple

Voyons à quel point la quantité d'informations diffère réellement avant / après l'application.

before

public class StoreService {
    
    public Store fetchStore(String storeId){
        // ...
    }

    public List<Store> fetchSisterStores(String storeId){
        // ...
    }

    public List<Coupon> fetchCoupons(String storeId,
                                         List<Category> categories){
        // ...
    }
}

after

public class StoreService {

    @Nonnull
    public Store fetchStore(final String storeId) {
        Assert.notNull(storeId, "store-id must not be null.");
        // ...

    }

    @Nullable
    public List<Store> fetchSisterStores(final String storeId) {
        Assert.notNull(storeId, "store-id must not be null.");

        // ...
    }

    @Nonnull
    public List<Coupon> fetchCoupons(final String storeId,
                                     final List<Category> categories) {
        Assert.notNull(storeId,    "store-id must not be null.");
        Assert.notNull(categories, "categories must not be null.");

        // ...
    }
}

N'est-ce pas un code plus expressif? Juste en lisant quelques lignes avant et après la signature, vous pouvez instantanément prendre la plupart des exemples, et le code est convivial.

Du point de vue de l'évaluateur, la différence dans les spécifications du type «List» retourné par «fetchSisterStores (...)» et «fetchCoupons (...)» est plus apparente, et la qualité de l'avis est susceptible de s'améliorer.

Résumé

Choisissez les contre-mesures «nul» en équipe et réduisez au maximum la dette technique causée par «null»! Et réalisons les mérites suivants avec toute l'équipe!

Ayons une bonne vie «nulle»!

Recommended Posts

Travailler comme une équipe! Face Null de front en Java
Java11: exécuter le code Java dans un seul fichier tel quel
Rechercher un sous-ensemble en Java
Lire les données WAV sous forme de tableau d'octets sur Android Java
Faites Option.ou Null de Scala en Java
3 Implémentez un interpréteur simple en Java
J'ai créé un PDF avec Java.
Un exemple simple de rappels en Java
Restez coincé dans un Java Primer
Fonctionnement des tableaux en Java (illustration)
A propos du renvoi d'une référence dans un Java Getter
Qu'est-ce qu'une classe en langage Java (3 /?)
Lors de la recherche de plusieurs dans un tableau Java
[Création] Un mémorandum sur le codage en Java
Java crée un tableau dans un document Word
Java crée un graphique circulaire dans Excel
Qu'est-ce qu'une classe en langage Java (1 /?)
Qu'est-ce qu'une classe en langage Java (2 /?)
Créer une application TODO dans Java 7 Créer un en-tête
Créons une application de calcul avec Java
Implémenter quelque chose comme une pile en Java
Diviser une chaîne avec ". (Dot)" en Java
Création d'une classe de matrice dans Java Partie 1
J'ai créé un programme de jugement des nombres premiers en Java
GetInstance () à partir d'une classe @Singleton dans Groovy à partir de Java
Deux façons de démarrer un thread en Java + @
Lire une chaîne dans un fichier PDF avec Java
Une histoire sur le JDK à l'ère de Java 11
Comment afficher une page Web en Java
Mesurer la taille d'un dossier avec Java
Code pour échapper aux chaînes JSON en Java
Essayez de créer un babillard en Java
Une note quand vous voulez Tuple en Java
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
J'ai écrit un programme de jugement des nombres premiers en Java
J'ai créé un jeu Janken en Java (CLI)
Afficher le texte en tant qu'art ASCII en Java (jfiglet)
Un fichier bat qui utilise Java dans Windows
Comment masquer les champs nuls en réponse en Java
Un examen rapide de Java appris en classe
J'ai écrit un programme de factorisation prime en Java
[Java] Quelque chose est affiché comme "-0.0" dans la sortie
Passer les conditions utilisées dans le filtre d'expression lambda Java8 () comme paramètres