[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
--Type paramétré ... Liste <String>
String
--Type générique ・ ・ ・ Liste <E>
--Paramètre temporaire ... ʻE`Liste <?>
Liste
--Paramètre de type de limitestatique <E> List <E> asList (E [] a)
--Type de jeton ・ ・ ・ String.class
Liste
etc. sans <>
)
--Il est normal d'utiliser List <Object>
. Vous pouvez passer List <String>
à List
(prototype), mais c'est sûr car vous ne pouvez pas le passer à List <Object>
.
--Set <Object>
est un type de paramètre (sûr) qui représente un Set qui peut contenir des objets de n'importe quel type.
--Set <?>
Est un type générique (sûr) qui représente un Set qui peut contenir des objets d'un type inconnu.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) { ... }
ClassCastException
au moment de l'exécution.
--Si vous ne pouvez pas supprimer l'avertissement non coché, supprimez l'avertissement avec l'annotation @SuppressWarnings (" non coché ")
et laissez la raison dans le commentaire.@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;
}
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);
}
}
}
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;
}
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)
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