Arbeitet als ein Team! Stellen Sie sich in Java frontal Null

Ich entschuldige mich für die Erfindung der Null-Referenz auf der Konferenz 2009.

Das ist mein Fehler im Wert von einer Milliarde Dollar.

Null Dies ist ein hasserfülltes Problem, das Entwickler, die unsichere Sprachen verwenden, immer plagt. Informatiker [Antony Hoa | wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%83%88%E3%83%8B% Wie E3% 83% BC% E3% 83% BB% E3% 83% 9B% E3% 83% BC% E3% 82% A2) oben sagte, handelt es sich um eine in die Sprache verwobene technische Verschuldung. Es ist keine Übertreibung zu sagen.

In der modernen Neuentwicklung sind null unsichere Sprachen keine Legacy-Sprachen mehr | Qiita Die Idee, null unsichere Sprachen selbst wie im Artikel zu vermeiden Es wird____geben. Es gibt jedoch immer noch Situationen, in denen Sie eine Sprache auswählen müssen, die aus verschiedenen Gründen nicht null-sicher ist.

Dieses Mal werde ich über die Methode nachdenken, Null in Java zu begegnen.

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

Vorsichtsmaßnahmen zum Lesen

――Der Gegenmaßnahmenplan hat eine "Empfehlungsstufe", ist jedoch ein persönlicher Eindruck, der auf Erfahrung beruht. ――Die Empfehlungsstufe bei der Aufnahme in ein Team wird in 3 Stufen angezeigt (: star: ~: star :: star :: star :)

Messen

JSR-305 Eine Gruppe von Anmerkungen, die für Software Defect Detection als Java-Spezifikation definiert sind.

Daher wird nicht erwartet, dass eine Annotation in Runtime funktioniert, sondern eine Spezifikation, die zum Zeitpunkt der Entwicklung als ** Hilfsfunktion ** definiert wurde (z. B. Unterstützung in IDEs wie Find Bugs und IntelliJ).

Deklarieren Sie, ob der Rückgabetyp "null" ist

Empfehlungsstufe :: star :: star :: star:

import javax.annotation.Nullable;

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

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

Es ist sehr wichtig, die Check-Support-Funktion nutzen zu können, aber ich hatte das Gefühl, dass die Effektivität in den folgenden Punkten bei der Arbeit im Team maximiert wird.

Deklarieren Sie, ob im Argument "null" zulässig ist

Empfehlungsstufe :: Stern:

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

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

Während die gleichen Vorteile wie "Angeben, ob der Rückgabetyp" Null "ist" erzielt werden können, fallen die folgenden Nachteile für das Team auf.

Java 8+ Standard Optional

Optional schlägt null als Rückgabetyp vor

Empfehlungsstufe :: Stern:

import java.util.Optional;

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

Java 8 Optional wird in vielen Artikeln erwähnt, daher werde ich nicht auf Details eingehen. Die Gründe, warum wir es hier nicht empfehlen, sind folgende.

■ Referenz

Anweisungsprogrammierung

"Ausdrucksprogrammierung", die die in Master Programmer eingeführten Voraussetzungen überprüft. Es ist sehr wertvoll, weil Sie damit das "übergeordnete Konzept" des Designers / Implementierers als Code belassen können.

Testen Sie die Programmannahmen mit "assert"

Empfehlungsstufe :: star :: star:

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

Ein typisches Beispiel für Express-Programmierung in Java ist "assert". Beachten Sie jedoch die folgenden Punkte im Code (Programmieren mit Zusicherungen | oracle.com). Auszug aus assert.html)

■ Aktivieren und Deaktivieren von Zusicherungen ** Standardmäßig sind Zusicherungen zur Laufzeit deaktiviert **. Sie können zwei Befehlszeilenoptionen verwenden, um Zusicherungen zu aktivieren / deaktivieren. Verwenden Sie die Schalter -enable Assertions oder -ea, um Assertions auf verschiedenen Detailebenen zu aktivieren.

Es kann gelesen werden, dass "assert" nur ein Hilfsmittel ist, um die Absicht des Implementierers auszudrücken, und nicht, um eine Ausnahme in der Laufzeit des Produktcodes auszulösen. Wenn Sie das offizielle Dokument sorgfältig lesen, werden wichtige Informationen wie die Verarbeitung mit Nebenwirkungen beschrieben. Daher muss überlegt werden, welche Art von Punkt bei der Annahme zu verwenden ist.

Nutzen Sie die Behauptungen der Bibliothek

Empfehlungsstufe :: star :: star :: star:

import org.springframework.util.Assert;

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

Für das Spring Framework org.springframework.util.Assert Verwendung ist das.

Im Gegensatz zu Java Assertion wird auch zur Laufzeit eine Ausnahme ausgelöst. Es ist eine Vereinfachung der Nullprüfung, funktioniert aber auch mit Runtime, sodass Sie dem Implementierer eine sehr starke Absichtserklärung in Ihrem Code hinterlassen können.

Indirekte Nullverteidigung

Deklarieren Sie die Variable "final", um sie unveränderlich zu machen

Empfehlungsstufe :: star :: star:

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

Die Verwendung von "final" scheint nicht in direktem Zusammenhang mit "null" zu stehen. In Kombination mit der Nicht-Null-Garantie in Assertion können Sie jedoch in Ihrer Methode fast vollständig Nicht-Null-Garantie garantieren. Infolgedessen können Sie unnötige Verarbeitungen wie "Ich weiß nicht, was kommen wird, also prüfen Sie vorerst" null "in der Zwischenverarbeitung sicher löschen.

Sammlung unveränderlich machen

Empfehlungsstufe :: star :: star:

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

Es ist eine ziemlich lokale Verteidigung, wenn es um unveränderliche Sammlungen geht.

Es verringert das Risiko, "Null" -Elemente in eine einmal erstellte Sammlung zu mischen, mit dem Ziel, "Null" -Ausnahmen bei der nachfolgenden Zwischenverarbeitung zu berücksichtigen. Es ist nüchtern, aber es sollte so viel wie möglich aufgenommen werden.

Beispiel

Mal sehen, wie sehr sich die Informationsmenge vor / nach der Anwendung tatsächlich unterscheidet.

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

        // ...
    }
}

Ist es nicht ein ausdrucksstärkerer Code? Wenn Sie nur ein paar Zeilen vor und nach der Signatur lesen, können Sie die meisten Beispiele sofort abrufen, und der Code ist benutzerfreundlich.

Aus Sicht des Überprüfers ist der Unterschied in den Spezifikationen des von "fetchSisterStores (...)" und "fetchCoupons (...)" zurückgegebenen "List" -Typs offensichtlicher, und die Qualität der Überprüfung wird sich wahrscheinlich verbessern.

Zusammenfassung

Wählen Sie als Team die Gegenmaßnahmen "Null" und reduzieren Sie die durch "Null" verursachten technischen Schulden bis zum Äußersten! Und lassen Sie uns die folgenden Vorteile mit dem gesamten Team realisieren!

Lass uns ein gutes Nullleben haben!

Recommended Posts

Arbeitet als ein Team! Stellen Sie sich in Java frontal Null
Java11: Führen Sie Java-Code unverändert in einer einzelnen Datei aus
Suchen Sie eine Teilmenge in Java
Lesen Sie WAV-Daten als Byte-Array unter Android Java
Führen Sie Scala's Option.or Null in Java aus
3 Implementieren Sie einen einfachen Interpreter in Java
Ich habe ein PDF mit Java erstellt.
Ein einfaches Beispiel für Rückrufe in Java
Bleiben Sie in einem Java Primer stecken
Funktionsweise von Arrays in Java (Abbildung)
Informationen zum Zurückgeben einer Referenz in einem Java Getter
Was ist eine Klasse in der Java-Sprache (3 /?)
Bei der Suche nach mehreren in einem Java-Array
[Erstellen] Ein Memorandum über das Codieren in Java
Java erstellt eine Tabelle in einem Word-Dokument
Java erstellt ein Kreisdiagramm in Excel
Was ist eine Klasse in der Java-Sprache (1 /?)
Was ist eine Klasse in der Java-Sprache (2 /?)
Erstellen Sie eine TODO-App in Java 7 Create Header
Lassen Sie uns eine Taschenrechner-App mit Java erstellen
Implementieren Sie so etwas wie einen Stack in Java
Teilen Sie eine Zeichenfolge in Java mit ". (Dot)"
Erstellen einer Matrixklasse in Java Teil 1
Ich habe ein Programm zur Beurteilung von Primzahlen in Java erstellt
GetInstance () aus einer @ Singleton-Klasse in Groovy aus Java
Zwei Möglichkeiten, einen Thread in Java + @ zu starten
Lesen Sie eine Zeichenfolge in einer PDF-Datei mit Java
Eine Geschichte über das JDK in der Java 11-Ära
So zeigen Sie eine Webseite in Java an
Messen Sie die Größe eines Ordners mit Java
Code zum Escapezeichen von JSON-Zeichenfolgen in Java
Versuchen Sie, ein Bulletin Board in Java zu erstellen
Ein Hinweis, wenn Sie Tupel in Java möchten
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Ich habe ein Programm zur Beurteilung von Primzahlen in Java geschrieben
Ich habe ein Janken-Spiel in Java (CLI) gemacht.
Text als ASCII-Grafik in Java anzeigen (jfiglet)
Eine Bat-Datei, die Java in Windows verwendet
So verbergen Sie Nullfelder als Antwort in Java
Ein kurzer Überblick über Java, das im Unterricht gelernt wurde
Ich habe ein Primfaktorisierungsprogramm in Java geschrieben
[Java] In der Ausgabe wird etwas als "-0.0" angezeigt
Übergeben Sie die im Java8-Lambda-Ausdruck filter () verwendeten Bedingungen als Parameter