[Effektives Java] Vermeiden Sie das Erstellen unnötiger Objekte

Effektive Java-eigene Interpretation. Ich habe versucht, Punkt 6 der 3. Ausgabe zu interpretieren, indem ich meinen eigenen Code geschrieben habe.

Überblick

Beispiele und Gegenmaßnahmen zur unnötigen Objekterzeugung

String


  String s = new String("hoge");  

Dieser Code erstellt zuerst ein Objekt mit den Buchstaben "hoge", dann erstellt ein "neuer String (" hoge ")" ein anderes Objekt mit den Buchstaben "hoge". Kurz gesagt, Objekte mit demselben Inhalt werden zweimal erstellt. Mit den folgenden Schritten können Sie das Objekt nur einmal erstellen.


  String s = "hoge";  

Boolean Das Boolean-Objekt kann tatsächlich erstellt werden, indem das String-Objekt als Argument verwendet wird, wie unten gezeigt.


  Boolean b = new Boolean("true");  

Erstens nimmt "Boolean" jedoch nur drei Werte an: "null", "wahr" und "falsch". In der Klasse "Boolean" werden "true" - und "false" -Objekte im Voraus in Form von Konstanten vorbereitet.

** Teil der Booleschen Klasse **


    public static final Boolean TRUE = new Boolean(true);
    public static final Boolean FALSE = new Boolean(false);

Es gibt auch eine "valueOf" -Methode, die diese Konstanten zurückgibt.


    public static Boolean valueOf(String s) {
        return parseBoolean(s) ? TRUE : FALSE;
    }

Wenn Sie also ein "Boolesches" Objekt mit der unten gezeigten "valueOf" -Methode deklarieren, müssen Sie nicht auf das ursprünglich von der "Boolean" -Klasse vorbereitete Objekt verweisen und ein neues erstellen.


  Boolean b = Boolean.valuOf("true");  

Ein Objekt, das bei jedem Aufruf einer Methode erstellt wird

Betrachten Sie die folgende Methode, um festzustellen, ob die Zeichenfolge eine korrekte römische Zahl ist.


  static boolean isRomanNumeral(String s) {
    return s.matches("^(?=.)M*(C[MD]|D?C{0,3})"
              + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
  } 

Da "String.matches" intern ein "Pattern" -Objekt erstellt, wird bei jedem Aufruf dieser Methode ein neues "Pattern" -Objekt erstellt. Wenn das "Pattern" -Objekt im Voraus als Konstante definiert wurde, kann das "Pattern" -Objekt zum Zeitpunkt der Klasseninitialisierung nur einmal erstellt werden.


  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})$");
                
    static boolean isRomanNumeral(String s) {
      return ROMAN.matcher(s).matches();
    } 
  }

Unnötiges Boxen

Betrachten Sie den folgenden Code.


private static long sum() {
  Long sum = 0L;
  for (long i = 0; i <= Integer.MAX_VALUE; i++)
    sum += 1;
    
  return sum;
}

Da "sum + = 1" intern wie "Long sum = sum + (Long) 1" jedes Mal umgewandelt und berechnet wird, wird jedes Mal ein "Long" -Objekt erstellt. Erstens erfordert diese Methode nicht, dass "Summe" vom Typ "Lang" ist, so dass das einfache Deklarieren von "Summe" vom Typ "Lang" die Geschwindigkeit erheblich verbessern kann. Dies ist ein einfaches Beispiel, aber Sie sollten sich immer darüber im Klaren sein, ob Sie eine Wrapper-Klasse verwenden müssen (Sie müssen "null" annehmen, mögliche Situationen usw.).

Hinweis

Die Idee ist, dass das Objekt eines Methodenarguments den Status innerhalb der Methode nicht ändern sollte. Dies liegt daran, dass es schwierig ist zu erkennen, in welchem Objekt sich das Objekt befindet, und das Risiko von Fehlern steigt. In diesem Fall sollten wir das Risiko des Auftretens von Fehlern reduzieren, indem wir ein neues Objekt in der Methode erstellen und den Inhalt des Argumentobjekts kopieren, es sei denn, die Leistung ist sehr wichtig.

Recommended Posts

[Effektives Java] Vermeiden Sie das Erstellen unnötiger Objekte
[Read Effective Java] Kapitel 2 Punkt 5 "Vermeiden Sie die Erstellung unnötiger Objekte"
[Read Effective Java] Kapitel 2 Punkt 7 "Vermeiden Sie Finalizer"
Effektives Java Kapitel 2
Effektives Java Kapitel 6 34-35
Effektives Java Kapitel 4 15-22
Effektives Java Kapitel 3
[Read Effective Java] Kapitel 2 Punkt 7 "Vermeiden Sie Finalizer"
Punkt 71: Vermeiden Sie die unnötige Verwendung geprüfter Ausnahmen
Java-Klasse, Instanz, Objekt
Effektive Java 3rd Edition Kapitel 3 Allen Objekten gemeinsame Methoden
Vermeiden Sie den Fehler, den Yuma in Java gemacht hat
Elastic Search Indexerstellung aus Java