Effektive Java 3rd Edition Kapitel 2 Objekterstellung und Verschwindenlassen

[Effective Java 3rd Edition](https://www.amazon.co.jp/Effective-Java-%E7%AC%AC3%E7%89%88-%E3%], ein Muss für fortgeschrittene Java-Benutzer und höher. 82% B8% E3% 83% A7% E3% 82% B7% E3% 83% A5% E3% 82% A2% E3% 83% BB% E3% 83% 96% E3% 83% AD% E3% 83% 83% E3% 82% AF-ebook / dp / B07RHX1K53) hat eine Kindle-Version, daher werde ich sie zusammenfassen. "Kapitel 1 Einführung" ist hauptsächlich eine Erklärung der Begriffe, daher werde ich sie überspringen.

Zurück: Keine Weiter: Effektive Java 3rd Edition, Kapitel 3, allen Objekten gemeinsame Methoden

Punkt 1 Betrachten Sie eine statische Factory-Methode anstelle eines Konstruktors

[Good]Beispiel für eine statische Factory-Methode


public static Boolean valueOf(boolean b) {
  return b ? Boolean.True : Boolean.False
}

--Vorteile der statischen Fabrikmethode

Punkt 2 Betrachten Sie einen Builder, wenn Sie mit vielen Konstruktorparametern konfrontiert sind

[Good]Beispiel für eine Builder-Klasse


public class NutritionFacts {
    private final int savingSize;
    private final int savings;
    private final int calories;
    private final int fat;
    private final int sodium;
    private final int carbohydrate;

    public static class Builder {
        //Verpflichtend
        private final int savingSize;
        private final int savings;

        //Optionaler Standardwert
        private int calories = 0;
        private int fat = 0;
        private int sodium = 0;
        private int carbohydrate = 0;

        public Builder(int savingSize, int savings) {
            this.savingSize = savingSize;
            this.savings = savings;
        }

        public Builder calories(int val) {
            calories = val;
            return this;
        }

        public Builder fat(int val) {
            fat = val;
            return this;
        }

        public Builder sodium(int val) {
            sodium = val;
            return this;
        }

        public Builder carbohydrate(int val) {
            carbohydrate = val;
            return this;
        }

        public NutritionFacts build() {
            return new NutritionFacts(this);
        }

    }

    private NutritionFacts(Builder builder) {
        savingSize = builder.savingSize;
        savings = builder.savings;
        calories = builder.calories;
        fat = builder.fat;
        sodium = builder.sodium;
        carbohydrate = builder.carbohydrate;
    }
}

lombok @ Builder Verwendungsbeispiel

Beispiel mit Lombok


import lombok.Builder;
import lombok.NonNull;

@Builder
public class LombokNutritionFacts {

    //Verpflichtend
    @NonNull
    private final Integer savingSize;
    @NonNull
    private final Integer savings;

    //Festlegen des Standardwerts
    @Builder.Default
    private final Integer calories = 0;
    @Builder.Default
    private final Integer fat = 0;
    @Builder.Default
    private final Integer sodium = 0;
    @Builder.Default
    private final Integer carbohydrate = 0;
}

Punkt 3 Erzwingen Sie Singleton-Eigenschaften mit einem privaten Konstruktor oder einem Aufzählungstyp

[Good]Singleton-Klasse mit Aufzählungstyp


//Singleton-Klasse mit Aufzählungstyp
public enum Elvis {
    INSTANCE;

    public void leaveTheBilding() {
        System.out.println("Hello Elvis!");
    }
}

//Beispiel aufrufen
public class Main {
    public static void main(String[] args){
        Elvis elvis = Elvis.INSTANCE;
        elvis.leaveTheBilding();
    }
}

Punkt 4 Unmöglichkeit der Instanziierung mit privatem Konstruktor erzwingen

[Good]


//Dienstprogrammklassen, die nicht instanziiert werden können
public class UtilityClass {
    //Erstellen Sie einen privaten Konstruktor, damit er nicht instanziiert werden kann
    private UtilityClass() {
        throw new AssertionError();  //Werfen, wenn in der Klasse gerufen
    }
    //Unten weggelassen
}

Punkt 5 Wählen Sie die Abhängigkeitsinjektion aus, anstatt Ressourcen direkt zu verknüpfen

[Bad]


//Unsachgemäße Verwendung statischer Dienstprogramme. Es fehlt Flexibilität und kann nicht getestet werden.
public class SpellCheckerStatic {
    private static final Lexicon dictionary = new MyDictionary();

    private SpellCheckerStatic() {
    }
    public static boolean isValid(String word) {
        //Kürzung
    }
    public static List<String> suggestions(String type) {
        //Kürzung
    }
}

[Good]


//Die Abhängigkeitsinjektion ist flexibel und testbar
public class SpellChecker {
    private final Lexicon dictionary;

    public SpellChecker(Lexicon dictionary) {
        this.dictionary = Objects.requireNonNull(dictionary);
    }
    public boolean isValid(String word) {
        //Kürzung
    }
    public List<String> suggestions(String type) {
        //Kürzung
    }
}

Punkt 6 Vermeiden Sie unnötige Objekte

//Dadurch entstehen unnötige Objekte
String s = new String("bikini");
//Sollte das tun
String s = "bikini";
public class RomanNumerals {
    private static final Pattern ROMAN = Pattern.compile(
            "^(?=.)M*(C[MD]|D?C{0,3})" +
                    "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");

    //[Gutes Beispiel] Verbesserte Version, die Objekte wiederverwendet
    static boolean isRomanNumerial(String s) {
        return ROMAN.matcher(s).matches();
    }

    //[Kein gutes Beispiel] Bei wiederholter Verwendung ist die Leistung schlecht
    static boolean isRomanNumerialBad(String s) {
        return s.matches("^(?=.)M*(C[MD]|D?C{0,3})" +
                "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
    }
}

Punkt 7 Entfernen Sie Verweise auf veraltete Objekte

public class Stack {
    private Object[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;
    public Stack() {
        this.elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }
    public void push(Object e) {
        ensureCapacity();
        elements[size++] = e;
    }
    public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        Object result = elements[--size];
        elements[size] = null;  //■ Veraltete Verweise entfernen ■
        return result;
    }
    //Wenn Sie es größer machen müssen, verdoppeln Sie es. Sichern Sie mindestens eine Kapazität.
    private void ensureCapacity() {
        if (elements.length == size) {
            elements = Arrays.copyOf(elements, 2 * size + 1);
        }
    }
}

Punkt 8 Vermeiden Sie Finalisierer und Reiniger

Punkt 9 Wählen Sie "Try-with-Resources" und nicht "Try-finally"

wie der Name schon sagt.

Recommended Posts

Effektive Java 3rd Edition Kapitel 2 Objekterstellung und Verschwindenlassen
Effektive Java 3rd Edition Kapitel 4 Klassen und Schnittstellen
Effektive Java 3rd Edition Kapitel 5 Generika
Effektive Java 3rd Edition Kapitel 8 Methoden
Effektives Java 3rd Edition Kapitel 9 Programm Allgemein
Effektive Java 3rd Edition Kapitel 3 Allen Objekten gemeinsame Methoden
Was hat sich zwischen Effective Java 2nd Edition und 3rd Edition geändert?
Effektives Java Kapitel 2
Effektives Java Kapitel 6 34-35
Effektives Java Kapitel 4 15-22
Effektives Java Kapitel 3
effektive Java 3. Zusammenfassung
[Read Effective Java] Kapitel 2 Punkt 6 "Veraltete Objektreferenzen entfernen"
Effektive Java 3rd Edition Abschnitt 85 Auswählen einer Alternative zur Java-Serialisierung
[Effektives Java] Veraltete Objektreferenzen entfernen
[Read Effective Java] Kapitel 2 Punkt 5 "Vermeiden Sie die Erstellung unnötiger Objekte"
[Read Effective Java] Kapitel 2 Punkt 7 "Vermeiden Sie Finalizer"
Java-Entwicklungsgrundlagen ~ Einstellungen für die Entwicklungsumgebung und Projekterstellung ~
Parallele und parallele Verarbeitung in verschiedenen Sprachen (Java Edition)
Effektive Zusammenfassung der Umfrage zu Java 2nd Edition
[Read Effective Java] Kapitel 3 Punkt 10 "Immer toString überschreiben"
[Java] Unterschied zwischen "endgültiger Variable" und "unveränderlichem Objekt"
Ich habe versucht, Effective Java 3rd Edition "fast alle Kapitel" in "leicht lesbarem Japanisch" zu erklären.