Efficacité de Java 3rd Edition Chapitre 5 Génériques

[Effective Java 3rd Edition](https://www.amazon.co.jp/Effective-Java-%E7%AC%AC3%E7%89%88-%E3%], qui est un livre indispensable pour les utilisateurs Java intermédiaires et supérieurs. 82% B8% E3% 83% A7% E3% 82% B7% E3% 83% A5% E3% 82% A2% E3% 83% BB% E3% 83% 96% E3% 83% AD% E3% 83% 83% E3% 82% AF-ebook / dp / B07RHX1K53) a une version Kindle, je vais donc le résumer.

Précédent: Classes et interfaces efficaces du chapitre 4 de Java 3rd Edition Suivant: Enum et annotations du chapitre 6 de Java 3rd Edition effective

le terme

--Type paramétré ... Liste <String>

Point 26: ne pas utiliser le prototype

Exemple de prototype


// NG
private final Collection stamps = ... ;
// OK
private final Collection<Stamp> stamps = ... ;

// NG
static int numElementsInCommon(Set s1, Set s2) { ... }
// OK
static int numElementsInCommon(Set<?> s1, Set<?> s2) { ... }

Élément 27 Supprimer l'avertissement non inspecté

@SuppressWarnings("unchecked")Supprimer les avertissements des annotations


public <T> T[] toArray(T[] a) {
  if (a.length < size) {
    // T[]Cette conversion est correcte car elle produit un tableau du même type qui a été passé comme
    @SuppressWarnings("unchecked") T[] result = (T[]) Arrays.copyOf(elementData, size, a.getClass());
    return result;    
  }
  System.arraycopy(elements, 0,va, 0, size);
  if (a.length > size)
    a[size] = null;
  return a;
}

Élément 28 Sélectionnez une liste dans un tableau

Point 29 Utiliser le type générique

Génériques inutilisés


public class Stack {
    private Object[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;

    public Stack() {
        this.elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }

    public void push(Object e) {
        ensureCapacity();
        elements[size++] = e;
    }

    public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        Object result = elements[--size];
        elements[size] = null;  //★ Supprimer les références obsolètes
        return result;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    private void ensureCapacity() {
        if (elements.length == size) {
            elements = Arrays.copyOf(elements, 2 * size + 1);
        }
    }
}

--Change ʻObject en ʻE.

Exemple de réécriture vers des génériques


public class Stack<E> {
    private E[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;

    @SuppressWarnings("unchecked")    //Supprimer les avertissements
    public Stack() {
        // new E[]Je ne peux pas, donc Object[]E[]Couler vers (aucun avertissement d'inspection n'apparaît)
        this.elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];
    }

    public void push(E e) {
        ensureCapacity();
        elements[size++] = e;
    }

    public E pop() {
        if (size == 0)
            throw new EmptyStackException();
        E result = elements[--size];
        elements[size] = null;  //★ Supprimer les références obsolètes
        return result;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    private void ensureCapacity() {
        if (elements.length == size) {
            elements = Arrays.copyOf(elements, 2 * size + 1);
        }
    }
}

Point 30 Utiliser la méthode générique

Méthode générique


    public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
        Set<E> result = new HashSet<>(s1);
        result.addAll(s2);
        return result;
    }

Élément 31 Utiliser des caractères génériques de limite pour améliorer la flexibilité de l'API

Exemple d'utilisation de jokers de bordure


    //Type générique pour les paramètres en tant que producteur électronique
    public void pushAll(Iterable<? extends E> src) {
        for (E e : src) {
            push(e);
        }
    }

    //Type générique pour les paramètres en tant que consommateur électronique
    public void popAll(Collection<? super E> dat) {
        while (!isEmpty()) {
            dat.add(pop());
        }
    }
public static <E> Set<E> union(Set<? extends E> e1, Set<? extends E> e2)

Point 32: Combinez soigneusement les génériques et les arguments de longueur variable

Point 33 Envisagez un contenant hétérogène de type sûr

Modèle de conteneur hétérogène de type sécurisé


public class Favorites {
    private Map<Class<?>, Object> favorites = new HashMap<>();

    public <T> void putFavorite(Class<T> type, T instance) {
        favorites.put(Objects.requireNonNull(type), instance);
    }

    public <T> T getFavorite(Class<T> type) {
        return type.cast(favorites.get(type));
    }
}

//Exemple d'appel
Favorites f = new Favorites();
f.putFavorite(String.class, "Java");
f.putFavorite(Integer.class, 0xcafebabe);
f.putFavorite(Class.class, Favorites.class);
String favoriteString = f.getFavorite(String.class);
int favoriteInteger = f.getFavorite(Integer.class);
Class<?> favoriteClass = f.getFavorite(Class.class);

Recommended Posts

Efficacité de Java 3rd Edition Chapitre 5 Génériques
Méthodes efficaces du chapitre 8 de Java 3rd Edition
Effective Java 3rd Edition Chapitre 9 Programme Général
Enum et annotations du chapitre 6 de Java 3rd Edition efficace
Efficacité de Java 3rd Edition Chapitre 4 Classes et interfaces
Efficace Java 3e édition Chapitre 7 Lambda et Stream
Efficace Java Chapitre 2
Effective Java 3rd Edition Chapitre 2 Création et disparition d'objets
Effective Java Chapitre 4 15-22
Java efficace Chapitre 3
Efficace Java 3rd Edition Chapitre 3 Méthodes communes à tous les objets
3ème résumé efficace de Java
Ce qui a changé entre la 2e édition effective de Java et la 3e édition
[Java] Génériques
[Lire Java efficace] Chapitre 2 Item 7 "Eviter les finaliseurs"
Résumé des génériques Java
Génériques Java (Notes)
Résumé de l'enquête sur les questions relatives à Java 2e édition efficace
[Lire Java efficace] Chapitre 3 Item 10 "Always Override toString"
Java Performance Chapitre 1 Introduction
[Lire Java efficace] Chapitre 3 Point 12 "Considérer l'implémentation de Comparable"
J'ai essayé d'expliquer Effective Java 3rd Edition "presque tous les chapitres" en "japonais facile à lire".
[Lire Java efficace] Chapitre 2 Item 6 "Supprimer les références d'objets obsolètes"
Génériques Java fréquemment utilisés
Modèle de générateur (Java effectif)
Mises à jour des notes personnelles en vigueur de Java Third Edition 2nd Edition
Java Performance Chapitre 3 Boîte à outils Java Performance
Guide de développement Java moderne (édition 2018)
Critères de commentaire personnel [édition Java]
[Java] Classe générique et méthode générique
Java Performance Chapter 2 Approche des tests de performances
java Generics T et? Différence
De Java inefficace à Java efficace
[Lire Java effectif] Chapitre 3 Rubrique 9 "Lors de la substitution d'égaux, toujours remplacer hashCode"
[Lire Java efficace] Chapitre 2 Item 5 "Eviter la création d'objets inutiles"