[JAVA] Élément 28: Préférer les listes aux tableaux

28. Utilisez des listes plutôt que des tableaux

package tryAny.effectiveJava;

public class GenericsTest5 {
    public static void main(String[] args) {

        Object[] objAry = new Long[1];
        objAry[0] = "aa";

        // Won't compile!
        // List<Object> ol = new ArrayList<Long>(); // Incompatible

    }
}
// Why generic array creation is illegal - won't compile!
List<String>[] stringLists = new List<String>[1];  // (1)
List<Integer> intList = List.of(42);               // (2)
Object[] objects = stringLists;                    // (3)
objects[0] = intList;                              // (4)
String s = stringLists[0].get(0);                  // (5)

Les types tels que * E et List sont appelés ** non réifiable **. La signification intuitive de ce mot est qu'il contient moins d'informations à l'exécution qu'au moment de la compilation. Seuls les types génériques utilisant le caractère générique? Sont réifiables, mais un tableau de génériques utilisant des caractères génériques n'a aucune valeur pratique.

package tryAny.effectiveJava;

import java.util.Collection;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

public class Chooser1 {
    private final Object[] choiceArray;

    public Chooser1(Collection choices) {
        choiceArray = choices.toArray();
    }

    public Object choose() {
        Random rnd = ThreadLocalRandom.current();
        return choiceArray[rnd.nextInt(choiceArray.length)];
    }

}

Selon Item29, j'ai écrit ce qui suit dans Generics. C'est un peu redondant et une dégradation des performances, mais cela ne lève pas d'exception ClassCastException au moment de l'exécution.

package tryAny.effectiveJava;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

//List-based Chooser - typesafe
public class Chooser2<T> {
    private final List<T> choiceList;

    public Chooser2(Collection<T> choices) {
        choiceList = new ArrayList<>(choices);
    }

    public T choose() {
        Random rnd = ThreadLocalRandom.current();
        return choiceList.get(rnd.nextInt(choiceList.size()));
    }
}

Recommended Posts

Élément 28: Préférer les listes aux tableaux
Rubrique 65: Préférez les interfaces à la réflexion
Rubrique 43: Préférez les références de méthode aux lambdas
Point 42: Préférez les lambdas aux classes anonymes
Élément 39: Préférez les annotations aux modèles de dénomination
Point 85: Préférez les alternatives à la sérialisation Java
Point 58: Préférez les boucles for-each aux boucles for traditionnelles
Élément 23: Préférez les hiérarchies de classes aux classes balisées
Point 61: Préférez les types primitifs aux primitives encadrées
17 Correspond à un tableau
Élément 81: Préférez les utilitaires de concurrence pour attendre et notifier
Élément 80: Préférez les exécuteurs, les tâches et les flux aux threads
Élément 89: Pour le contrôle d'instance, préférez les types enum à readResolve
Élément 47: Préférez la collecte au flux comme type de retour
Étudier le tableau, la liste, la carte Java
Comment utiliser le tableau (mémorandum personnel)
Point 46: Préférez les fonctions sans effets secondaires dans les flux
Java, des tableaux pour débuter avec les débutants
[Traitement × Java] Comment utiliser les tableaux