[Effective Java 3rd Edition](https://www.amazon.co.jp/Effective-Java-%E7%AC%AC3%E7%89%88-%E3%], ein Muss für fortgeschrittene Java-Benutzer und höher 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) hat eine Kindle-Version, daher werde ich sie zusammenfassen.
Zurück: Effektive Java 3rd Edition, Kapitel 4, Klassen und Schnittstellen Weiter: Effektive Java 3rd Edition, Kapitel 6, Aufzählung und Anmerkungen
--Parameterisierter Typ ... List <String>
String
--Generischer Typ ・ ・ ・ Liste <E>
E
Liste <?>
Liste
E erweitert Nummer>
--Retroaktive Grenze ・ ・ ・ <T erweitert Vergleichbare <T >>
--Boundary Wildcard-Typ List ・ ・ List <? Extends Number>
--Generische Methode ・ ・ ・ statische <E> Liste <E> asList (E [] a)
--Type Token ・ ・ ・ String.class
Liste
etc. ohne <>
)Beispiel eines Prototyps
// 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) { ... }
@SuppressWarnings("unchecked")Unterdrücken Sie Warnungen aus Anmerkungen
public <T> T[] toArray(T[] a) {
if (a.length < size) {
// T[]Diese Umwandlung ist korrekt, da sie ein Array des gleichen Typs erzeugt, der als übergeben wurde
@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;
}
Generika unbenutzt
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; //★ Veraltete Verweise entfernen
return result;
}
public boolean isEmpty() {
return size == 0;
}
private void ensureCapacity() {
if (elements.length == size) {
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}
}
Beispiel für das Umschreiben in Generika
public class Stack<E> {
private E[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
@SuppressWarnings("unchecked") //Warnungen unterdrücken
public Stack() {
// new E[]Kann nicht, also Objekt[]E.[]Cast to (es erscheint keine Inspektionswarnung)
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; //★ Veraltete Verweise entfernen
return result;
}
public boolean isEmpty() {
return size == 0;
}
private void ensureCapacity() {
if (elements.length == size) {
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}
}
Generische Methode
public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
Set<E> result = new HashSet<>(s1);
result.addAll(s2);
return result;
}
Beispiel für die Verwendung von Rand-Platzhaltern
//Platzhaltertyp für Parameter als E-Produzent
public void pushAll(Iterable<? extends E> src) {
for (E e : src) {
push(e);
}
}
//Platzhaltertyp für Parameter als E-Consumer
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)
Typensicheres heterogenes Containermuster
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));
}
}
//Beispiel aufrufen
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