[Read Effective Java] Kapitel 2 Punkt 5 "Vermeiden Sie die Erstellung unnötiger Objekte"

Vermeiden Sie unnötige Objekte

Wie der Titel schon sagt. Das versehentliche Erstellen von Objekten führt zu einer schlechten Leistung. Lassen Sie uns ein wenig darüber nachdenken und es schreiben, um keine nutzlosen Objekte zu erzeugen.

Glossar

Automatisches Boxen

In Java gibt es zwei Typen: primitiven Typ (Basistyp) und Referenztyp. Primitive Typen wie int können nicht in eine Sammlung eingefügt werden. Primitive Werte müssen in die entsprechende Wrapper-Klasse (Integer für int) "eingerahmt" werden, da die Auflistung nur Objektreferenzen enthalten kann. Wenn Sie ein Objekt aus der Sammlung abrufen, erhalten Sie die gespeicherte Ganzzahl. Wenn Sie ein int benötigen, müssen Sie es mit der intValue-Methode aus der Ganzzahl "entpacken". Da die explizite Implementierung eine Quelle der Komplexität darstellt, verfügt Java über automatische Funktionen zum Ein- und Auspacken. Automatisches Boxen für die automatische Konvertierung vom primitiven Typ in die Wrapper-Klasse Die automatische Konvertierung von der Wrapper-Klasse in den primitiven Typ wird als Unboxing bezeichnet.

Primitiver Typ Wrapper-Klasse
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double

Unveränderlich

Ein Objekt, dessen Status nach seiner Erstellung nicht mehr geändert werden kann.

Beispielcode

Dieser Code erstellt bei jeder Ausführung dieses Teils eine neue String-Instanz.

Beispiel 1


String s = new String("stringette");  //Tu das nicht

Das ist in Ordnung

Beispiel 2


String s = "stringette";  

Betrachten Sie beispielsweise die Person-Klasse mit der isBabyBoomer-Methode, die bestimmt, ob eine Person eine Babyboom-Generation ist. Beim Schreiben von ↓ werden jedes Mal, wenn die isBabyBoomer-Methode aufgerufen wird, unnötig neue Instanzen von Calender, TimeZone, boomStart und boomEnd Date erstellt. Tu das nicht.

Beispiel 3


public class Person {
    private final Date birthDate;

    //Lassen Sie andere Felder, Methoden und Konstruktoren weg
    
    //Tu das nicht!
    public boolean isBabyBoomer() {
        //Unnötige Erzeugung kostspieliger Objekte
        Calender gmtCal = 
            Calender.getInstance(TimeZone.getTimeZone("GMT"));
        gmtCal.set(1946, Calender.JANUARY, 1, 0, 0, 0);
        Date boomStart = gmtCal.getTime();
        gmtCal.set(1965, Calender.JANUARY, 1, 0, 0, 0);
        Date boomEnd = gmtCal.getTime();
        return birthDate.compareTo(boomStart) >= 0 &&
               birthDate.compareTo(boomEnd)   <  0 ;     
    }
}

Beispiel 4 verbesserte die schlechten Punkte von Beispiel 3. Wenn die Klasse initialisiert wird, werden die Instanzen Calender-Instanz, TimeZone-Instanz, BoomStart und BoomEnd Date nur einmal erstellt. Dies kann eine erhebliche Leistungssteigerung bedeuten, wenn die isBabyBoomer-Methode häufig aufgerufen wird.

Beispiel 4


public class Person {
    private final Date birthDate;

    //Lassen Sie andere Felder, Methoden und Konstruktoren weg

    /**
     *Start- und Enddatum des Babybooms.
     */
    private static final Date BOOM_START;
    private static final Date BOOM_END;

    static {
        Calender gmtCal =
            Calender.getInstance(TimeZone.getTimeZone("GMT");
        gmtCal.set(1946, Calender.JANUARY, 1, 0, 0, 0);
        BoomStart = gmtCal.getTime();
        gmtCal.set(1965, Calender.JANUARY, 1, 0, 0, 0);
        BoomEnd = gmtCal.getTime();
    }

    public boolean osBabyBoomer() {
        return birthDate.compareTo(BoomStart) >= 0 &&
               birthDate.compareTo(BoomEnd)   <  0 ;    
    }
}

Beispiel 5 ist aufgrund eines Tippfehlers mit einem Buchstaben ziemlich langsam. Die variable Summe wird als Long statt long deklariert. Infolgedessen erstellt das Programm ungefähr 2 ^ 31 unnötige Long-Instanzen. (Jedes Mal, wenn Sie Long i zu Long sum hinzufügen, erhöht sich eine Instanz.)

Lektion: Wählen Sie einen Basisdatentyp gegenüber einem Boxed-Basisdatentyp und achten Sie auf unbeabsichtigtes automatisches Boxen

Beispiel 5


//Ein schrecklich langsames Programm! Können Sie auf die Objekterstellung hinweisen?
public static void main(String[] args) {
    Long sum = OL;
    for (long i = 0; i <= Integer.MAX_VALUE; i++) {
        sum += i;
    }
    System.out.println(sum);
}

Fortsetzen

[Read Effective Java] Kapitel 2 Punkt 6 "Veraltete Objektreferenzen entfernen" https://qiita.com/Natsukii/items/5f2edd6a9bcdb94b03e5

Recommended Posts

[Read Effective Java] Kapitel 2 Punkt 5 "Vermeiden Sie die Erstellung unnötiger Objekte"
[Read Effective Java] Kapitel 2 Punkt 7 "Vermeiden Sie Finalizer"
[Read Effective Java] Kapitel 3 Punkt 12 "Berücksichtigung der Implementierung von Comparable"
[Effektives Java] Vermeiden Sie das Erstellen unnötiger Objekte
[Read Effective Java] Kapitel 2 Punkt 1 "Betrachten Sie statische Factory-Methoden anstelle von Konstruktoren"
[Read Effective Java] Kapitel 2 Punkt 6 "Veraltete Objektreferenzen entfernen"
[Read Effective Java] Kapitel 2 Punkt 4 "Unmöglichkeit der Instanziierung mit privatem Konstruktor erzwingen"
[Read Effective Java] Kapitel 3 Punkt 9 "Wenn Sie equals überschreiben, überschreiben Sie immer hashCode"
Punkt 71: Vermeiden Sie die unnötige Verwendung geprüfter Ausnahmen
Messen Sie einfach die Größe von Java-Objekten
[Read Effective Java] Kapitel 2 Punkt 2 "Betrachten Sie einen Builder, wenn Sie mit einer großen Anzahl von Konstruktorparametern konfrontiert werden."
Effektives Java Kapitel 2
Effektives Java Kapitel 6 34-35
Effektives Java Kapitel 4 15-22
Effektives Java Kapitel 3
Effektive Java 3rd Edition Kapitel 2 Objekterstellung und Verschwindenlassen
[Read Effective Java] Kapitel 2 Punkt 3 "Singleton-Eigenschaften mit privatem Konstruktor oder Aufzählungstyp erzwingen"
Effektive Java 3rd Edition Kapitel 3 Allen Objekten gemeinsame Methoden
[Java] Erstellen von Originalanmerkungen
Lesen Sie die ersten 4 Bytes der Java-Klassendatei und geben Sie CAFEBABE aus
[Java] Löschen Sie die Elemente von List
[Java Edition] Geschichte der Serialisierung
Ich habe die Quelle von ArrayList gelesen, die ich gelesen habe
Liste der Java-Objekte sortieren
Ich habe die Quelle von Integer gelesen
Effektive Java 3rd Edition Kapitel 5 Generika
Ich habe die Quelle von Long gelesen
Effektive Java 3rd Edition Kapitel 8 Methoden
Ich habe die Quelle von Short gelesen
Ich habe die Quelle von Byte gelesen
Der Ursprung von Java-Lambda-Ausdrücken