Wann sollte man Generika verwenden?
Immer in ein wenig Verwirrung hier, Wann Generika:
Sagen, ich habe:
public class Honda implements ICar(){
}
public class Opel implements ICar(){
}
sollte ich verwenden:
public class Person{
ICar car;
.
.
public Person (ICar c){
car = c;
}
}
oder
public class Person<T extends ICar>{
T car;
.
.
public Person(T c){
car = c;
}
}
oder kommt es auf die Aufgaben durchgeführt?
EDIT: Also ist Generika nur für die aggregation Beziehungen (Behälter etc.)?
EDIT: Das könnte helfen:
Denke ich bin ich Fragen, ist Generika nur für die Verwendung mit Sammlungen?
Kommentar zu dem Problem
Generika ist nicht nur für die Verwendung mit Sammlungen, obwohl es sicherlich spielt es die wichtigste Rolle. Es ist für überall, wo Sie wollen, um eine Objekt-Instanz oder Methode etc. arbeiten für eine bestimmte Art als das, was Sie entwerfen es für Sie, und überprüfen Sie während der Kompilierung (nur im Fall von Java) wenn Sie das Objekt mit dem richtigen Typ. Jedoch, Ihre Nutzung Fall nicht scheinen zu implizieren, dass die Art der Beziehung.
Sie können verwendet werden, mit jeder Klasse, ein "nicht-so-gutes" Beispiel ist ein DAO framework, in dem alle konkrete DAO-Klassen erweitern eine
GenericDAO<E, Pk>
in interface/abstrakte Klasse. In diesem Modell jedes DAO ist verbunden mit der Person und der Primärschlüssel Arten und die konkreten Implementierungen Verhalten sich möglicherweise anders, abhängig von den tatsächlichen Werten für diese Parameter. @user997112 ich denke nicht so, wenn man sich die Collection-Klassen, Sie wurden entwickelt, um intern arbeiten mit generischen Typen und verwenden Sie Sie mit spezifischen Typen, wenn Sie Sie verwenden.
InformationsquelleAutor der Frage mezamorphic | 2012-07-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer person ist in der Regel nicht parametrisiert mit einer Art von Auto. Nur sehr ärgerlich, Personen definiert sind, die von Ihrem Auto. Personen ändern Autos auch (in der Zeit). Also ich würde nicht parametrieren Sie das Klasse, wenn auch nur für die Semantik.
Überlegen Sie, was Sie versuchen zu imitieren, von der realen Welt, bevor wir in eine solche Programmierung details.
InformationsquelleAutor der Antwort Maarten Bodewes
Die Unterscheidung ist nicht immer abgeholzt, aber hier sind ein paar Hinweise:
Und schließlich, einen Allgemeinen Gedanken, das fand ich wirklich nützlich: wenn Sie unsicher sind, scheuen Sie sich nicht zum Vorbild. Schreiben Sie den code in beide Richtungen und prüfen Sie, welches aussieht, einfacher und leichter zu verstehen. Zeigen Sie es an jemand anderen, ohne irgendwelche Erklärungen oder vielleicht einen Tag warten oder zwei und dann wieder Lesen den code selbst. Dann werfen Sie die anderen Weg. Wegwerfen code ist gut.
InformationsquelleAutor der Antwort biziclop
Müssen Sie den Generika-version, wenn Sie irgendwelche Methoden oder Rückgabe etwas mit einem T, oder, wenn es möglich ist, mit anderen Menschen Zugriff auf Ihre
car
Feld. (Da Sie nicht zeigen, keine Methoden, können wir nicht wirklich sagen.)Beispielsweise mit dem Generika-version Sie können eine Methode wie
T someMethod();
dann, wenn jemand einePerson<Honda>
, Sie wissen, Sie können Holen Sie sich einHonda
zurück wenn Sie rufen SiesomeMethod
, anstatt eine unbekannte Art von Auto, wenn Sie nicht über Generika.Ähnlich, mit der Generika-version Sie können eine Methode wie
void anotherMethod(T anotherCar);
dann, wenn jemand einePerson<Honda>
, das Sie zwingt, sich zu übergeben, eineHonda
dieser Methode, anstelle von jedem Auto.Also im Grunde, dass eine generische Klasse können Sie Beschränkungen auf Verwendungen des Objekts später (Methodenaufrufe etc.). Wenn der Konstruktor ist der einzige Ort, dass Sie T verwenden, und Sie nicht brauchen, um T in keine Methoden oder Felder, dann ja, es gibt keinen Punkt dafür.
InformationsquelleAutor der Antwort newacct
Dies hat zu tun mit der Verwendung von Vererbung versus Komposition.
Ohne zu wissen, jede andere Semantik, die Zusammensetzung scheint mehr relevant. Eine person kann sich ändern, Autos, ohne dabei eine andere person.
http://www.artima.com/objectsandjava/webuscript/CompoInherit1.html
http://en.wikipedia.org/wiki/Composition_over_inheritance
InformationsquelleAutor der Antwort VSOverFlow
Ich würde eher zu Gunsten Zusammensetzung (was Sie fordern dynamische Bindung), insbesondere in dem Fall, dass Sie verwenden. Eine person ist nicht eine Art von ICar, so dass die Verwendung der Generika-hier ist irgendwie seltsam (für mich jedenfalls). Ich möchte, dass Generika verwendet werden, als eine Art zu sagen, "Ein container für ICar", wie in der Garage, obwohl in diesem Fall könnte ich nur mit einem collection-Typ als eine variable, oder erweitern Sie den collection-Typ, wenn es wirklich benötigt wird.
InformationsquelleAutor der Antwort Robert
Ich würde vorschlagen, den Fokus auf Semantik ersten:
Bietet Ihnen eine
Bmw
und einToyota
Klassen implementieren dieICar
- Schnittstelle, dann stellen Sie diese Frage: kann einPerson
ändern, sein Auto, oder wäre es ein anderer Mensch, wenn er das tut?Den Generika-Ansatz wird die Kraft, die Sie zum erstellen einer neuen
Person
Beispiel, wenn aus irgendeinem Grund Sie brauchen, um den Wert zu ändern dercar
Attribut ausToyota
zuBmw
in einer existenten person-Instanz und damit, diese neue person wird anders sein als die Vorherige. Natürlich, können Sie die erstenPerson
Instanz alsPerson<ICar>
anstelle der Befestigung auf einem bestimmten Auto Klasse, aber warum verwenden Sie Generika dann?InformationsquelleAutor der Antwort Alonso Dominguez