Variable statique + initialisation de bloc statique VS initialisation statique

Sep 25 2020

Dans la documentation de salesforce, il y a l'exemple suivant.

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));
    }
}

Est-ce l'approche recommandée? Quelle est la différence entre cela et le suivant?

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)
    };

}

J'avais l'impression que l'initialisation de la carte sur la déclaration est plus efficace que de créer une carte vide et de placer les éléments un par un. Est-ce faux?

Je comprendrais que si cela se faisait sur un getter, ce serait une initialisation "paresseuse", mais ce n'est pas le cas, n'est-ce pas?

Qu'est-ce que j'oublie ici?

Réponses

1 sfdcfox Sep 25 2020 at 20:16

Oui, l'initialisation directe d'une carte est plus efficace que l'utilisation de Map.put. L'exemple de bloc statique était plus illustratif que normatif. Le fait est que si vous devez exécuter la logique lorsque la classe est chargée, vous pouvez utiliser un initialiseur de bloc statique. C'est l'équivalent de l'utilisation d'un constructeur pour initialiser les instances de votre classe. Je préfère les blocs statiques à l'initialisation en ligne afin de tout regrouper (je le trouve plus lisible de cette façon).

Par exemple, si vous deviez interroger une liste de métadonnées, puis les mettre dans une structure, vous voudriez un initialiseur de bloc statique. Bien sûr, certains préfèrent utiliser l'initialisation en ligne, et tant que c'est possible, c'est très bien. Je recommanderais de ne pas mélanger les deux; initialisez en ligne ou dans un bloc statique, mais pas les deux. Cela améliore la lisibilité de la classe.