Auf Seite 140 von Effective Java wird empfohlen, dass eine Methodensignatur mit einem Platzhalter einem Platzhalter mit einem Typparameter vorzuziehen ist, der nur einmal angezeigt wird. Zum BeispielRohtypen und Leistung
public static void swap(List<?> list, int i, int j)
vorzuziehen
public static <T> void swap(List<T> list, int i, int j)
jedoch nicht möglich ist, ein Element eines List<?>
zu setzen, etwas zu sein (außer null
) so Effective Java schlägt eine private Hilfsmethode schreiben zu machen die Signatur mit einem Platzhalter arbeiten.
private static <T> void swapHelper(List<T> list, int i, int j) {
list.set(i, list.set(j, list.get(i)));
}
public static void swap(List<?> list, int i, int j) {
swapHelper(list, i, j);
}
jedoch sah ich den Quellcode für Collections.swap
und entdeckt, dass die Art und Weise, dass sie um das List<?>
Problem bekamrohe Typen zu verwenden war.
public static void swap(List<?> list, int i, int j) {
final List l = list;
l.set(i, l.set(j, l.get(i)));
}
Wir werden darauf hingewiesen, nicht roh Arten in neuem Code zu verwenden (außer in instanceof
Schecks). Also, ich würde gerne wissen, was ist der Grund hier? Gibt es einen Leistungsvorteil bei der Verwendung roher Typen hier, anstatt eine private Hilfsmethode aufzurufen? Wenn nicht, gibt es Beispiele, bei denen die Verwendung von Rohtypen die Leistung verbessern kann?
Rohtypen können vermieden werden, indem 'List
* "(außer bei Prüfungen)" * Dies ist nicht wahr. "instanceof List >" ist in Ordnung und bevorzugt. ;) – Radiodef
@Radiodef Nicht nach Effective Java (2. Ausgabe) Seite 114. –