N
C++ vs. Java schrieb:
Zu Templates:
Dafür hat man in Java ja Generics. Oder kann man das jetzt nicht ganz vergleichen?
Java Generics sind wegen Type Erasure nur für Typsicherheit zur Kompilierzeit gut. Du kannst damit keine generische Programmierung im Sinne von statischer Polymorphie umsetzen. Du hast nicht einmal Typsicherheit zur Laufzeit, was in der sonst strikt laufzeitgeprüften Sprache eine beträchtliche Lücke darstellt.
C++ vs. Java schrieb:
Typedefs benutzt man in C++ daher, um seinen eigenen Datentyp zu definieren, der dann auf jeder Plattform gleich groß ist
Nein, das ist nur ein Spezialfall. Typedefs sind ein Abstraktionsfeature. Du kannst damit von Typen abstrahieren, Aliase erstellen und bei Bedarf ohne Client-Code-Anpassungen die Implementierung auswechseln. Z.B. verschiedene STL-Container oder Iteratoren.
Jockelx schrieb:
Doch, kann man vergleichen, allerdings kommt beí dem Vergleich raus, dass Templates mächtiger sind.
Auch wenn es mich in der Praxis nicht/selten stört.
Mich schon. Ist relativ schwierig, in Java generischen Code zu schreiben -- Klassen und Interfaces eigenen sich nur beschränkt, gerade wenn sie fertig vorgegeben sind.
Kürzlich gehabtes Beispiel: Ich benötigte eine Factory, die verschiedene von einer Basisklasse abgeleitete Objekte konstruieren sollte. C++:
// einmal:
template <typename T>
std::unique_ptr<Base> create()
{
return std::make_unique<T>();
}
// pro Aufruf:
x.registerFactory(&create<MeinTyp>);
Java (der Fairheit halber gleicher Klammerstil, um Codemenge zu vergleichen):
// einmal:
interface Factory
{
Base create();
}
// pro Aufruf:
x.registerFactory(new Factory()
{
@Override
public Base create()
{
return new MeinTyp();
}
}
Du kannst dir vorstellen, dass es bei etlichen verschiedenen Typen langsam nervig wird, das Interface jeweils erneut zu implementieren. Lambdas würden hier zwar das Syntaxproblem etwas minimieren, aber das grundlegende bleibt. Worauf es hinausläuft, ist dass man dauernd Reflection braucht, wenn man Boilerplate-Code vermeiden möchte -- was aus diversen Gründen auch nicht ideal ist.
Und hier gehts ja noch, weil man nicht wirklich statische Polymorphie braucht. Wenn du aber eine bekannte Methode für unbekannte Typen aufrufen willst, müssen die in Java schon ein Interface implementiert haben. Haben sie das nicht, hast du entweder Pech gehabt oder kannst gross refactoren.
C++ vs. Java schrieb:
Okay für Strings noch, aber ein Feature, welches in Java nicht notwendig ist, würde ich jetzt nicht als Vorteil von C++ anführen, wie es Nexus getan hat.
Du hast Recht, dass man Typedef in Java nicht so stark vermisst wie man es in C++ täte. Das hat mit dem allgemeinen Programmierparadigma zu tun, das viel weniger auf Generizität ausgerichtet ist und Abstraktion nur in der Form von Klassen kennt.