Statische Variable + statische Blockinitialisierung VS statische Initialisierung
Im Dokument von Salesforce gibt es das folgende Beispiel.
public class MyClass {
class RGB {
Integer red;
Integer green;
Integer blue;
RGB(Integer red, Integer green, Integer blue) {
this.red = red;
this.green = green;
this.blue = blue;
}
}
static Map<String, RGB> colorMap = new Map<String, RGB>();
static {
colorMap.put('red', new RGB(255, 0, 0));
colorMap.put('cyan', new RGB(0, 255, 255));
colorMap.put('magenta', new RGB(255, 0, 255));
}
}
Ist das der empfohlene Ansatz? Was ist der Unterschied zwischen diesem und dem folgenden?
public class MyClass {
class RGB {
Integer red;
Integer green;
Integer blue;
RGB(Integer red, Integer green, Integer blue) {
this.red = red;
this.green = green;
this.blue = blue;
}
}
static Map<String, RGB> colorMap = new Map<String, RGB>{
'red' => new RGB(255, 0, 0),
'cyan' => new RGB(0, 255, 255),
'magenta' => new RGB(255, 0, 255)
};
}
Ich hatte den Eindruck, dass das Initialisieren der Karte in der Deklaration effizienter ist als das Erstellen einer leeren Karte und das Hinzufügen von Elementen nacheinander. Ist das falsch?
Ich würde verstehen, dass wenn es auf einem Getter gemacht würde, es eine "faule" Initialisierung wäre, aber ist das nicht der Fall, oder?
Was vermisse ich hier?
Antworten
Ja, das direkte Initialisieren einer Karte ist effizienter als die Verwendung von Map.put. Das statische Blockbeispiel war eher illustrativ als vorschreibend. Der Punkt ist, wenn Sie beim Laden der Klasse Logik ausführen müssen, können Sie einen statischen Blockinitialisierer verwenden. Dies entspricht der Verwendung eines Konstruktors zum Initialisieren von Instanzen Ihrer Klasse. Ich bevorzuge statische Blöcke gegenüber der Inline-Initialisierung, um alles zusammenzufassen (ich finde es auf diese Weise besser lesbar).
Wenn Sie beispielsweise eine Liste von Metadaten abfragen und diese dann in eine Struktur einfügen müssen, benötigen Sie einen statischen Blockinitialisierer. Natürlich bevorzugen einige die Inline-Initialisierung, und solange es möglich ist, ist das in Ordnung. Ich würde empfehlen, die beiden nicht zu mischen; entweder inline oder in einem statischen Block initialisieren, aber nicht beide. Dies trägt zur Lesbarkeit der Klasse bei.