Generics & Collections

Hacer

Aktives Mitglied
Hallo zusammen,
Könnte mir jemand anhand dieses Quellcodes sagen, was die Vorteile von Generics in diesem Fall ist?
ich würde sagen, dass durch Generics es sichergestellt wird, dass nur Elemente vom Typ E in der Liste enthalten sind.

Java:
class Utilities<E>{
            public List<E> operator(final List<E> a, final List<E> b){
                final List <E> c= new LinkedList<>();
                for(E e: a){
                    if(b.contains(e)){
                        c.add(e);
                    }
                }
                return c;
            }
           
        }
 
Generics sind eigentlich dazu gedacht, redundanten Code zu vermeiden. Ob man nun sagt "Generics vermeiden redundanten Code wo ohne Generics Typsicherheit redundanten Code erfordert" oder ob man sagt "Generics bieten Typsicherheit wo ohne Generics redundanter Code erforderlich wäre", ist mmn. Geschmackssache.

Dieses Beispiel nutzt Generics allerdings noch nicht voll aus. Mit dieser Signatur kann man mehr Fälle abdecken:

Java:
public List<E> operator(final List<? extends E>, final List<? extends E> b) {
 
@Tobse hier werden doch auch generische Methoden wie z.B. contains und add implementiert, diese Methoden helfen hier dabei Vergleiche zu tätigen oder halt Elemente einzufügen.
 
@Tobse hier werden doch auch generische Methoden wie z.B. contains und add implementiert, diese Methoden helfen hier dabei Vergleiche zu tätigen oder halt Elemente einzufügen.
Was die Methoden tun ist ja völlig egal.

Nehmen wir mal folgendes Beispiel: Du möchtest eine Collection mit Autos und eine mit Schiffen haben. Ohne Generics musst du zwischen Typsicherheit und Redundantem Code wählen:

Java:
class AutoListe {
    public void add(Auto auto) { ... }
    public void remove(Auto auto) { ... }
    public AutoIterator iterator() { ... }
    // u.s.w.
}

class SchiffListe {
    public void add(Schiff schiff) { ... }
    public void remove(Schiff schiff) { ... }
    public SchiffIterator iterator() { ... }
    // u.s.w.
}
Mit dieser Version hast du zwar Typsicherheit, musst aber für jeden Unterschiedlichen Typ allen Code duplizieren. Bei einer Änderung der Funktionsweise hast du dann viel, viel Arbeit. (redundanter Code)

Java:
class Liste {
    public void add(Object item) { ... }
    public void remove(Object item) { ... }
    public Iterator iterator() { ... }
    // u.s.w.
}

Hiermit musst du den Code nur exakt ein mal erstellen und auch nur an exakt einer Stelle pflegen (kein redundanter Code). Allerdings hast du nun keine Typsicherheit mehr.


Beide Varianten sind ein Problem denn sie sind auf unterschiedliche Weise beide sehr, sehr Fehleranfällig. Generics sind dafür gedacht, exakt dieses Problem zu lösen. Überall wo dieses Problem entsteht, macht es Sinn, Generics einzubauen. Und Collections sind ein Paradebeispiel dafür.
 
@Tobse ok erstmal dankeschön. Noch eine Frage und zwar was ist mit "final List<E> a" gemeint?Warum final?
[...] Ist eher dann eine Frage des Stils.
+1 - man sagt mit dem final quasi aus "An diesem Objekt wird nichts verändert, es wird als reine Eingabe verwendet". Zu früheren Zeiten konnte man durch den Einsatz von final noch minimal Performance herauskitzeln; heute sind die Compiler schlau genug, das selbst zu optimieren womit final de-facto nur noch semantische Zwecke erfüllt.
 

Neue Themen


Zurück
Oben