Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
In wie fern lohnt sich C++ für einen Javaentwickler
Auf der einen Seite gibt es, besonders auf der Linuxseite, unheimlich viele interessante Projekte in C++. Auf der anderen Seite ist Java konzeptionell weiter als C++ und bringt bei Performance und Programmiereleganz einiges mehr als C++, wohingegen C++ bei der Paradigmavielfalt wohl Java noch einiges voraus ist.
Glaubt ihr, dass die gängigen Programme wie Desktop Environments oder oft genutzte Programme wie Webbrowser irgendwann in Java entwickelt werden? Oder hat Java gegenüber C++ entschiedene Nachteile.
Wem gehört die Zukunft? Lohnt sich das Lernen von C++ überhaupt noch für einen Javaentwickler? Für welche Bereiche ist C++ geeigneter als Java?
Sicher, dass du C++ meinst?
Schau mal hier. -> TIOBE Software: The Coding Standards Company
Also die Zukunft gehört wohl dem portablen Bytecode (C# und Java), den Rest (JNI, bei C#... k.P. lässt sich afaik auch direkt native kompilieren) bekommt man gut mit C hin. Was will man mehr?
Hatte vor einigen Jahren mal nach Performanceunterschieden zwischen LWJGL, JOGL und nativen OpenGL gesucht, daraus ging hervor, dass diese damals schon kaum messbar waren.
Also die Zukunft gehört wohl dem portablen Bytecode (C# und Java), den Rest (JNI, bei C#... k.P. lässt sich afaik auch direkt native kompilieren) bekommt man gut mit C hin.
Vieleicht auf dem PC aber nicht Embedded - da ist es (dummerweise) eher C oder sehr C lastiges C++. Unter Embedded ist es sinnlos erst eine VM zu starten und anschließend das eigentliche Programm.
(persönlich) C++ hat einige Vorteile gegenüber C, Polymorphie ist ein absoluter Segen in der Programmierung.
Hatte vor einigen Jahren mal nach Performanceunterschieden zwischen LWJGL, JOGL und nativen OpenGL gesucht, daraus ging hervor, dass diese damals schon kaum messbar waren.
Natürlich, sonst hätte man diese Sprache nicht entwickelt. Bytecode-Sprachen wie C# und Java bieten aber nicht blos Polymorphie. Ausserdem könnte man auch sagen, dass Java gegenüber C++ weitere Vorteile hat und C# evtl. sogar noch viel mehr. Vllt. gibt es ja bald CPP2Bytecode- oder C#2Embedded-Compiler. Faktisch ist Bytecode nichts anderes als nativer Code für virtuelle Maschinen bzw. virtuelle Prozessoren.
Weil's der einzig verbleibende Grund ist, wo man sich für nativen Code entscheiden würde, solange man die Wahl hat und penibel Taktzyklen zählt. Ansonsten kann man sich nur noch an guten Sprachkonzepten und deren Erlernbarkeit orientieren.
Also um die Frage mal klar zu beantworten: Wenn man nicht gerade irgendwelche Microcontroller programmiert, wo ohnehin C vorherrscht, lohnt sich für einen "bereits" Java-Entwickler die zusätzliche Erlernung von C++ kaum.
Hatte vor einigen Jahren mal nach Performanceunterschieden zwischen LWJGL, JOGL und nativen OpenGL gesucht, daraus ging hervor, dass diese damals schon kaum messbar waren.
Es ist aber nun mal so, dass alle guten Engines/Frameworks (für Spiele/3D) eben für C++ geschrieben sind.
Glaub nicht, weil du es angesprochen hast, Browser in Zukunft in java geschrieben werden.. ich bin jetzt keine java guru, aber wenn ich nur mal überlege was mit c++ geht, da wüsst ich nichtmal wo ich in java ansetzen soll (aber auch vllt nur weil mir die kentnisse fehlen), beispielsweise irgend ein programm hooken, und dann im speicher rumfummeln, auf hinstances zugreifen etc.. hat auch irgendwie was schönes die sprache mit den operatoren überladen und den ganzen möglichkeiten die man hat, aber vom schreibaufwand ist das ja auch wieder ein gutes stück mehr als in Java.
Ich find, was spricht dagegen beides zu können. Syntax beim programmieren ist eh immer das selbe und dann muss man eben die sprachspezifischen feinheiten lernen, aber das sollte wohl auch kein all zu großes problem darstellen, wenn man sich wirklich für interessiert
Es ist aber nun mal so, dass alle guten Engines/Frameworks (für Spiele/3D) eben für C++ geschrieben sind.
Glaub nicht, weil du es angesprochen hast, Browser in Zukunft in java geschrieben werden.. ich bin jetzt keine java guru, aber wenn ich nur mal überlege was mit c++ geht, da wüsst ich nichtmal wo ich in java ansetzen soll (aber auch vllt nur weil mir die kentnisse fehlen), beispielsweise irgend ein programm hooken, und dann im speicher rumfummeln, auf hinstances zugreifen etc.. hat auch irgendwie was schönes die sprache mit den operatoren überladen und den ganzen möglichkeiten die man hat, aber vom schreibaufwand ist das ja auch wieder ein gutes stück mehr als in Java.
Ich find, was spricht dagegen beides zu können. Syntax beim programmieren ist eh immer das selbe und dann muss man eben die sprachspezifischen feinheiten lernen, aber das sollte wohl auch kein all zu großes problem darstellen, wenn man sich wirklich für interessiert
Das ist vollkommen korrekt, mit c++ kann man mehr machen. Dafür hätte man in Java allerdings noch JNI, was dann allerdings auch dort die Portabilität einschränkt. Es spricht nur wenig dagegen mehrere Sprachen zu können. Ich würde aber eher noch C anstatt C++ lernen, von wegen JNI, der Programmierung von Microcontollern usw (Java und C streiten sich deswegen seit geraumer Zeit auch um die ersten beiden Plätze auf dem TIOBE-Index). Die Syntax ist immer... sagen wir ähnlich. Weil das so ist, kann das Erlernen von zwei oder mehr Programmierspachen zu ungewollten Verwechslungen führen und das nicht nur bei der Syntax. Wenn einem solche Verwechslungen beim Erlernen einer neuen Sprache auffallen und man das nicht in den Griff bekommt, sollte man es lieber aufgeben oder auf Eis legen und irgendwann einen neuen Versuch starten. Je mehr Sprachen man sich aneignet, desto häufiger verhaspelt man sich.
Schwer zu sagen. Ich habe zuerst C gelernt, dann C++ und zuletzt Java und auch mit allen dreien Geld verdient. Andere Sprachen noch davor / dazwischen und zusätzlich.
Es ist ja lange nicht nur die Syntax, die es zu erlernen gilt. Die ist meist schnell erledigt. Als nächstes kommen dann die Standardbibliotheken hinzu und als fast das wichtigste, wie ich finde, den "Geist" der Sprache zu erfassen und zu verinnerlichen. Tut man das nicht, dann wird man immer holprig und unelegant in einer Sprache bleiben.
Man kann in allen Sprachen Fortran programmieren, wenn man will. (Ja, damit hab ich auch schon Geld verdient, ist aber etwas her.)
Das sollte vermutlich nur heißen, dass nur weil man technisch eine Sprache "nutzt", man diese aber eigentlich doch nicht nutzt (Konventionen, Techniken, ...). Beispielsweise ist Java ja OOP, es gibt aber auch Leute, die prozedural programmieren oder sonst was anstellen, nur kein OOP 😵[/OT]
hmmm - weil Objectiv-C geradezu explodiert ist in 3 Jahren? Java geht langsam Berg ab, .NET hällt sich ungefähr die Waage (VB--, C#++). C++ geht runter.
Weil's der einzig verbleibende Grund ist, wo man sich für nativen Code entscheiden würde, solange man die Wahl hat und penibel Taktzyklen zählt.
Wenn Du anfängst Taktzyklen zu zählen musst Du in den vom Compiler erzeugten Code schauen - bevor der Assembler drüber fährt. Und wenn Du das machen musst, dann befindest Du Dich nicht mehr auf einem normalen PC sondern im embedded Bereich und machst Sicherheitskritische Echtzeitanwendungen. Nicht mal den aktuellen Prozessor den ich programmiere zähle ich die Taktzyklen - wozu auch?
Bei allen anderen Dingen sind die Prozessoren völlig unterfordert.
Wenn man nicht gerade irgendwelche Microcontroller programmiert, wo ohnehin C vorherrscht,
C++ lohnt sich auf jeden Fall, weil es besser und schneller ist als Java.
:joke:
Ich würde fast so weit gehen, zu sagen, dass sich jede (echte) Programmiersprache "lohnt". (~"Lohnt sich Spanisch wenn man schon Italienisch kann?") Das übliche Bashing und was für welchen speziellen Fall in welcher Hinsicht "besser" ist, findet sich in ungefähr 31231 Threads hier im Forum und im Netz insgesamt.
Das finde ich ja interessant. Warum hatte ObjiC den größten Zulauf unter den "oberen" Sprachen und warum geht der Trend für Java nach unten, hätte etwas umgekehrtes erwartet
Weil wenn man für gayphones entwickeln muss nunmal in objectc programmiert (erzwungenermaßen) , und da das richtig kacke dokumentiert ist muss man halt mehr nachfragen / googlen ect, und schon hat man bei der art wie dieser index generiert wird einen richtig hohen wert 😉
(An all Mac Fag's es handelt sich hierbei um eine halb sarkastische aussage, ihr braucht nicht aus protest flugzeuge in hochhäuser fliegen)
Dabei kann es sich nur um ein Bundle wie z.B. Arduino handeln (Arduino selber natürlich nicht, denn da steht offiziell C/C++) und nicht um eine reine Prorgammierschnittstelle (ISP InSystemProgrammer). Letztere lassen die Sprache relativ (auf der Treiber CD ist eigentlich immer ein C-Compiler zu finden) offen, weil letztendlich auch da nur für den Controller verständlicher "Bytecode" (prozessorabhängiger Maschinencode) übertragen wird.
Was immer wieder gerne vergessen wird, ist die Tatsache, dass Programmiersprachen eigentlich nur Dolmetscher zwischen Mensch und Maschine sind und als Programmiersprache deswegen nur das in Frage kommt, was man am ehesten versteht.
C++ ist und bleibt die Weiterentwicklung von C, bietet unter anderem OOP dessen Kenntnisse man sich als Javaentwickler hoffentlich bereits angeeignet hat. Warum also sollte man sich noch mit C++ belasten, wenn man mit Java und C selbiges erreicht. Den Horizont erweitern, ist eine gute Idee aber nur wenn man plant, es auch zu nutzen. Das wäre für Java vorwiegend der Microcontroller-Bereich, obwohl ich da auch schon von Javaprozessoren gehört, mich aber noch nie damit befasst habe. Das hier ist zwar 'ne Einführung in die Programmierung, könnte aber dennoch hilfreich sein.
Genau meine Meinung! Erst die eine Sprache zu einem Punkt lernen, dass man sagen kann, man sei sattelfest und fängt an an den Grundlagen zu kratzen. Dann kann man sich auf die nächste Sprache stürzen. 🙂
Zum Beispiel? Du meinst doch nicht etwa solch abgrundtief hässliches wie Java Generics?
Warum man C++ lernen sollte? Nun, um richtig programmieren zu lernen natürlich 🙂 Viele Java Entwickler haben null Ahnung, wenns mal etwas technisch tiefer gehen soll. Zwar geht es auch mit C technisch in die Tiefe, aber C++ ist wesentlich mehr als nur eine "Erweiterung" von C. Gerade die Art und Weise wie C++ mit Klassen und Objekten umgeht ist für Java Entwickler immer ganz toll und begeisternd, wenn sie dann mal durchgestiegen sind.
Da muss ich KuhTee zustimmen.. ich bin Fanboy von gar nichts, also nicht falsch verstehen, aberals ich dann C++ "richtig gelernt" hab, hatte ich manchmal wirklich Euphorie momente, weil alles plötzlich einen Sinn ergab. Einfach weil es notwendig war, dies im Zuge dessen was im Buch gemacht wurde zu erklären (in dem C++ Buch). Oder das man nicht nur auf Funktionen des Java SDK zugreift, sondern sich wirklich mal selber Gedanken macht wie etwas funktioniert (klar gibt es bspw auch Boost, aber mal davon abgesehen).
Ich z.B. hab C++ "nur" für DirectX gelernt. Wofür auch sonst, Treiber schreib ich keine (warum oder wofür auch), für Microcontroller nimmt man wie gesagt eh C, und wenns an etwas mit ner GUI geht lieber C# oder Java, was wesentlich bequemer als der "Umweg" über QT ist.
Trotzdem muss ich sagen, dass mir das C++ lernen am meisten gebracht hat - in Punkto das ich wirklich verstehe was da passiert und wie und eben nicht nur das etwas passiert.
Zum Beispiel? Du meinst doch nicht etwa solch abgrundtief hässliches wie Java Generics?
Warum man C++ lernen sollte? Nun, um richtig programmieren zu lernen natürlich 🙂 Viele Java Entwickler haben null Ahnung, wenns mal etwas technisch tiefer gehen soll. Zwar geht es auch mit C technisch in die Tiefe, aber C++ ist wesentlich mehr als nur eine "Erweiterung" von C. Gerade die Art und Weise wie C++ mit Klassen und Objekten umgeht ist für Java Entwickler immer ganz toll und begeisternd, wenn sie dann mal durchgestiegen sind.
Trolling vom feinsten. :lol:
Wenn man richtig programmieren will, sollte man sich Maschinensprache aneignen. Ansonsten ist's doch wohl Sache des Entwicklers, welchen "Dolmetscher" er bevorzugt bzw. bevorzugen kann. Je nach dem, was möglich ist und man besser versteht.
Hier steht auch nirgends, dass C++ 'ne simple C-Erweiterung ist, sondern 'ne Weiterentwicklung von C, mit viel neuem und einigen "Einschränkungen" (also Dinge die, warum auch immer, in C++ nicht mehr funktionieren). Wär's nur 'ne Erweiterung, gäbe es keinen Unterschied zu C, denn man könnte beliebig zwischen den Sprachen wechseln.
Die Frage nach dem lohnen:
- Hobbytechnisch werden dich andere Programmiersprachen nicht weiter bringen als es bereits Java tut, sie werden dich sogar eher zurücksetzen. Es gibt keinen Grund eine andere Sprache zu erlernen der selben Generation.
- In der Industrie ist es aber wichtig, nicht nur die theoretische Syntax eines Programmes zu kennen (das hilft dir schonmal überhaupt nicht weiter) sondern eine Sprache musst du verstehen und anwenden können in verschiedenen Bereichen.
-> Wir hatten es hier mal vor kurzem da hat die eine Seite mit C++ und wir mit Java gearbeitet.
Der Retter des Tages war dann der der für die connection der Systeme gesorgt hat und zwar in einem passablen Zeitraum.
Um nur ein praktisches Beispiel zu nennen.
In einem Vorstellungsgespräch angeben zu können, man kenne mindestens eine weitere Sprache als die firmenspezifische bringt oft schonmal einen sehr großen Bonus ein.
Verschiedene Situationen können auftreten, oder Nebenprojekte entstehen die in einer anderen Sprache gelöst werden müssen (Und da gibt es so einige Gründe) wie bspw. (um nur noch ein Beispiel zu nennen) hat ein Kundenpc nicht unbedingt eine JVM auf seinen (meist Windows) Rechnern installiert und das dauert dann häufig mal eine ganze Woche bis auf einem Firmenpc eine neue Software installiert ist.
Dann ist es natürlich besser Sprachen zu verwenden die direkt jeder Windows-PC ausführen kann.
Und an solchen Situationen revanchiert sich die investierte Zeit.
Gruß
Net
PS: Programmiersprachen sind für die meisten Entwickler oftmals soetwas wie Religionen. Und da jeder alles bockig in seiner Programmiersprache haben will...
Das funktioniert nur weil Du C++ nicht verstanden hast. OOP macht mir auf dem BlackFin die Entwicklung um einiges leichter und weniger Fehleranfällig gegenüber C. Und der Destruktor ist ein Segen (auf dem Cupid) - ich vermisse diesen unter Java genau so wie unter .NET. (Das Aufräumen des Objektes vom GC ist für mich ein untragbares nicht deterministisches Verhalten)
schön das für Dich die Welt nur Schwarz und Weiß ist - AixControl | AixOS Real-time Operating System
...
Das funktioniert nur weil Du C++ nicht verstanden hast. OOP macht mir auf dem BlackFin die Entwicklung um einiges leichter und weniger Fehleranfällig gegenüber C. Und der Destruktor ist ein Segen (auf dem Cupid) - ich vermisse diesen unter Java genau so wie unter .NET. (Das Aufräumen des Objektes vom GC ist für mich ein untragbares nicht deterministisches Verhalten)
Also ich würde diese AIX-Geschichte oder Cupid (kenn' ich beides nicht) nicht gerade als Microcontroller bezeichnen, Microcontroller sind meines Wissens einfache ICs.
Ich habe C++ nicht blos nicht nur verstanden, ich hab's mir noch nicht mal im Detail angeschaut, weil es halt noch nicht nötig war. OOP programmiere ich in Java und wenn etwas nicht in Java zu realisieren ist, bau' ich halt per JNI und C ein natives Binding. Das man sich in Java auf den GC nicht verlassen kann, ist richtig, aber es gibt ja glücklicherweise Techniken, mit denen man Speicher- und GC freundlich programmieren kann. Zumindest muss man sich weniger Gedanken um Memleaks machen, nur weil man mal irgendwo vergessen hat einen Destruktor aufzurufen.
Das eine Sprache fehleranfälliger sein kann, als 'ne andere, halte ich persönlich für ein Gerücht. Fehler macht nämlich ausschliesslich der jeweilige Entwickler und nur sehr wenige davon sind Flüchtigkeit, sondern entstehen eher dadurch, das der Entwickler die Programmiersprache nicht vollends beherrscht.
Das sich C++ für einen Javaentwickler nicht unbedingt lohnt, heisst ja nicht, dass C++ eine schlechte Sprache ist. Networks Beitrag kann man, bis auf die Tatsache, dass es Windows bzw. der Hardware völlig egal ist, durch welchen Sprachkompiler die ausführbaren Kompilate gejagt wurden, nur unterschreiben.
Die Frage nach dem lohnen:
- Hobbytechnisch werden dich andere Programmiersprachen nicht weiter bringen als es bereits Java tut, sie werden dich sogar eher zurücksetzen. Es gibt keinen Grund eine andere Sprache zu erlernen der selben Generation.
PS: Programmiersprachen sind für die meisten Entwickler oftmals soetwas wie Religionen. Und da jeder alles bockig in seiner Programmiersprache haben will...
Das eine Sprache fehleranfälliger sein kann, als 'ne andere, halte ich persönlich für ein Gerücht. Fehler macht nämlich ausschliesslich der jeweilige Entwickler und nur sehr wenige davon sind Flüchtigkeit, sondern entstehen eher dadurch, das der Entwickler die Programmiersprache nicht vollends beherrscht.
Wie schon gesagt wurde: Allein diese eine Aussage zeigt, dass du keine Ahnung von C++ hast, nicht weisst wie man damit programmiert, und trotzdem spielst du hier den Checker. Klingt für mich nach... hm... wie war das Wort doch gleich... ? 🙂
Ich hab eben schon mehrfach gesehen, wie (durchaus gute) Java Entwickler das erste mal mit C++ entwickelt haben. Da herrschte dann noch das falsche Denken "wenn man eine kann, kann man alle, Unterschiede sind nur Syntax" vor, und schon wurden riesige Objekte kopiert, Objekte beim Kopieren versehentlich geändert, und einfach umständlich programmiert (nämlich nach Java Art). Irgendwer schrieb hier, dass Java eleganter als C++ wäre... ach kommt schon, Java ist eine ungemein geschwätzige Sprache mit vielen Macken (und einem riesigen Auswahl an Bibliotheken, dafür mag ich es).
Vielleicht sollte man einfach C++ lernen um zu verstehen, was an Java alles Mist ist 😉 (Generics, Try-with-ressources, als "Referenzen" bezeichnete (Null-)Pointer, ...). Dann fällt es einem auch leichter, für das jeweilige Projekt das richtige Werkzeug zu wählen. Denn das ist bei weitem nicht so egal, wie es hier manche darstellen.
Wie schon gesagt wurde: Allein diese eine Aussage zeigt, dass du keine Ahnung von C++ hast, nicht weisst wie man damit programmiert, und trotzdem spielst du hier den Checker. Klingt für mich nach... hm... wie war das Wort doch gleich... ? 🙂
Gehen dir die Argumente aus, oder was? Hier geht's darum, ob es sich lohnt als Javaentwickler noch C++ zu lernen. Die Frage ist doch, wofür sollte man. Die Antwort: "Aber bitte, wenn's dir Spass macht."
Irgendwer schrieb hier, dass Java eleganter als C++ wäre... ach kommt schon, Java ist eine ungemein geschwätzige Sprache mit vielen Macken. Vielleicht sollte man einfach C++ lernen um zu verstehen, was an Java alles Mist ist 😉
Klar... Macken hat C++ natürlich keine. Aber was soll's, Java mag vllt. beim Tiobe-Index gefallen zu sein, aber hast dir C++ mal angeschaut? Und dann nicht nur die roten Pfeile, sondern das Ganze Programm: Ratings, Deltas, 10-Jahres-Übersicht. Na was soll's... kann mir sehr gut vorstellen, dass viele C++-Lobbiisten so zwischen 2004 und 2005 irgendwie den Verstand verloren haben. Sieht ja aus wie'n Börsencrash. Mir sagen diese "Linien" jedenfalls, dass ich "genug" Ahnung von C++ habe, um zu wissen, das ich es nicht brauche: "Es gibt da 'ne Programmiersprache, die soll nicht so Kagge sein wie Java. Nur was daran besser ist, können nicht mal die vernünftig in wenige Worte packen, die es eigentlich können müssten. Viel schlimmer noch, sie diskreditieren auch noch meine Frau... ach nee, mein Auto... oder war's doch nur meine Religion?"
Also ich würde diese AIX-Geschichte oder Cupid (kenn' ich beides nicht) nicht gerade als Microcontroller bezeichnen, Microcontroller sind meines Wissens einfache ICs.
Wie kann man sich nur selber so disqualifizieren?? AixControl stellt komplette Boards mit Microcontrollern her speziell abgestimt auf die Bedürfnisse des Kunden. Dieser Aussage entnehme ich also das Du Dich mit dem Thema noch nichtmal auseinander setzen willst.
Ich habe C++ nicht blos nicht nur verstanden, ich hab's mir noch nicht mal im Detail angeschaut,
ach - und wieso meinst Du dann hier irgendwas über C++ behaupten zu können? Ich programmiere auch mit PHP und dennoch würde ich mir nicht anmaßen anderen PHP ausreden zu wollen. Dafür programmiere ich zu wenig damit.
OOP programmiere ich in Java und wenn etwas nicht in Java zu realisieren ist, bau' ich halt per JNI und C ein natives Binding.
Gratulation - Window (Java 2 Platform SE v1.4.2) - setzt Dich doch mal bitte mit Java und GC auseinander. Und im übrigen hat .NET das gleiche Problem. Das ist auch der Grund wieso ich es nicht verstehe warum .NET und Java keine Destruktoren mehr haben.
Wenn jemand C++ - Entwickeln möchte, dann soll er C++ lernen.
Wenn jemand ein besserer Programmierer werden möchte, dann würde ich nicht zusätzlich C++ lernen.
Programmiersprachen entstehen oft aus einer Problem-Domäne heraus.
Erlang für verteilte hochverfügbare Systeme.
Lisp als Funktionale Sprache.
Und wenn ich nun ein besserer Programmierer werden möchte, würde ich mir auf diese Art die Sprache aussuchen die ich dazulernen möchte um die konzepte zur Lösung der Probleme zu erlernen, weshalb diese Sprachen entstanden sind.
Java und C++ sehe ich in dieser Form konzeptional zu nahe beieinander.
Meiner Meinung nach, ist das schwerste bei der Softwareentwicklung Probleme zu lösen. Die Lösung dann in Form von Quellcode niederzuschreiben, ist im Vergleich wieder einfach.
Wenn man eine Sprache lernt, lernt man nicht nur Syntax, sondern Konzepte, neue Frameworks und neue Herrangehensweißen.
Das ist ungefähr so wie bei einem Handwerker, der einen Werkzeugkoffer hat. Man kann eine Schraube mit einem Schraubenzieher oder mit einem Akkuschrauber einschrauben. Mit dem Akkuschrauber geht es schneller, aber dazu muss man erst einmal wissen, dass es Akkuschrauber gibt und sich einen zulegen.
Als guter Softwareentwickler muss man sich immer weiterentwickeln und seinen Werkzeugkoffer ständig erweitern. Daher ist es nie falsch eine weitere Sprache zu lernen.
Ich portiere gerade beruflich ein in C++ geschriebenes Programm nach Java, daher sind meine (zugegebenermaßen rudimentären) C++ Kenntnisse nützlich. Zwar denke ich nicht, dass ich je als C++ Entwickler arbeiten werden, aber alten Code zu portieren kann einem immer wieder passieren.
KuhTee hat zumindest damit recht, dass Try-with-ressources mehr oder weniger ein Fehler waren, was auch auf der Seite von Java bereits zugegeben wurde, die null Pointer sind aber ok, solange man damit Fehler auslöst und nicht damit programmiert. Und Ja ich habe bereits mitbekommen, dass C/C++ mehr im Bereich Generics drauf haben als Java.
Nun frage ich mich aber, warum Java Destruktoren haben sollte? Ist es nicht genau das eine der stärken von Java, das es sich um die Objektverwaltung keine Gedanken machen muss? Und was dispose als Argument zu suchen hat, kann ich auch nicht nachvollziehen. vielleicht mag mir das mal hier einer erklären.
Nun frage ich mich aber, warum Java Destruktoren haben sollte? Ist es nicht genau das eine der stärken von Java, das es sich um die Objektverwaltung keine Gedanken machen muss? Und was dispose als Argument zu suchen hat, kann ich auch nicht nachvollziehen. vielleicht mag mir das mal hier einer erklären.
Wenn Du Dir mal genau durch liest welche Aufgabe Dispose hat (egal ob Java oder .NET) wirst Du feststellen das sich genau hier die Objektverwaltung selber ins Bein schießt.
In der Methode Dispose werden native Resourcen freigeben. Unter .NET ist das z.B. alles was mit GDI+ zusammen hängt. Wenn Du also jetzt ein Objekt erzeugst und bevor Du die Referenz weg wirfst kein Dispose aufrufst, erzeugst Du Memory-Leaks. Eigentlich genau das was beide Sprachen verhindern wollen. Ob ich jetzt an der Stelle manuell Dispose aufrufe oder wie unter C++ das Objekt mittels delete (und damit Destruktor) zerstöre kommt aufs gleiche raus.
Das Dumme an der Stelle ist das beide Sprache eben genau das breit treten das man sich nicht um die Speicherfreigabe kümmern muss. Zwar bietet C# an der Stelle using an, aber wenn ich ein Objekt länge brauche muss ich wieder vorher Dispose aufrufen. Und beide Sprachen greifen (naturbedingt) auf Systemresourcen zu: Fenster, Grafiken, blabla.
Ein kleines Beispiel
Java:
public static void main(String[] args) {
new MyFrame(false);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.gc();
System.runFinalization();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
}
Der Thread dient nur dazu um den GC zu bitten mal etwas zu arbeiten - ob er es wirklich macht weis ich nicht.
Es wird weder finalize noch dispose aufgerufen. Zu Laufzeit kann sein das der GC einfach nicht will - was in Ordnung ist (trotz das ich ihn persönlich bitte was zu machen). Aber spätestens wenn das Hauptfenster geschlossen wird sollte doch wenigstens irgendwas aufgerufen werden. Die Dispose Methode (zumindest für JFrame) wird erst bei setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) aufgerufen. (Im Übrigen auch ohne das ich den GC bitte mal aufzuräumen)
Solange wie es nur ein Programm ist was morgens startet und abends beendet wird, kann über das Detail (meistens) hinweg gesehen werden. Das BS räumt anschließend freundlicher weise alles sauber auf. Aber hast Du das auf einem Server, holst ständig Resourcen und nicht via Dispose frei gibst, dann frisst sich der Server voll - das ist schlecht.
Ich arbeite beruflich zu wenig mit Java, aber ich habe ein Beispiel unter C#. Ca. 80 Kameras liefern 1x pro Sekunden ein Jpeg-Bild (zumindest hole ich es). Dann male ich darauf einen Zeitstempel und speichere die Dinger in einer DB. Nach dem Speichern habe ich, entsprechend der allg. Aussage der Hersteller, die Referenz einfach "vergessen". Nach ca. 24 bis 48 Stunden hat sich der Server entsprechend voll gefressen und fing an Arbeitspeicher auf die Festplatte auszulagern, irgend wann knallt es eben. Erst nachdem ich nach dem Speichern noch Dispose aufgerufen habe, war der Speicherverbrauch vernüftig.
Hier geht's darum, ob es sich lohnt als Javaentwickler noch C++ zu lernen. Die Frage ist doch, wofür sollte man. Die Antwort: "Aber bitte, wenn's dir Spass macht."
In welcher Sprache wird eigentlich so eine JVM in der Regel entwickelt? 🙂 Fakt ist, dass ca 80 bis 90% der Software auf meinem Rechner (ohne OS) in C++ geschrieben ist. Auf den meisten PCs wirds ähnlich aussehen. Fakt ist auch, dass C++ in der Industrie ungemein wichtig ist. Natürlich, die typischen Webanwendungen schreibt keiner in C++. Aber die Welt ist _deutlich_ größer.
Aber was soll's, Java mag vllt. beim Tiobe-Index gefallen zu sein, aber hast dir C++ mal angeschaut? Und dann nicht nur die roten Pfeile, sondern das Ganze Programm: Ratings, Deltas, 10-Jahres-Übersicht.
Mal abgesehen davon, dass der Tiobe-Index immer mit Vorsicht zu genießen ist (man kann ihn auch dahingehend interpretieren, dass Java so bescheiden ist, dass alle Welt Fragen hat), frage ich mich, was genau du damit aussagen willst? Die Notwendigkeit und Sinnhaftigkeit einer Sprache am Tiobe-Index festmachen? Das wird langsam lächerlich. Also wenn man Java kann, bedeutet das, dass PHP, JavaScript, SQL, Lisp usw alle unnötig sind, weil Java im Index höher steht?
AixControl stellt komplette Boards mit Microcontrollern her speziell abgestimt auf die Bedürfnisse des Kunden. Dieser Aussage entnehme ich also das Du Dich mit dem Thema noch nichtmal auseinander setzen willst.
Nee, das ging in den falschen Hals, über dieses werde ich mich schon informieren. Ich kannte es wirklich noch nicht. Ob ich's (inkl. C++) dann auch brauche ist 'ne andere Geschichte. Immerhin; Danke für den Tipp.
Im übrigen masse ich mir nicht an, dem TO etwas auszureden, sondern überlasse es ihm. Ihr (du und QT) dagegen, masst euch an, soviel über beide Sprachen zu wissen und wisst über Java nur die Hälfte und über C++ anscheinend gar nichts, sonst würdet ihr mit Beispielen von dem was ihr wisst nicht so hinterm Berg halten und nicht dauernd nur Java kritisieren.
Zum GC... wenn man sich mit damit richtig auseinander setzen würde, würde man wissen, dass man von "finalize()", "dispose()", "System.gc()" und Zeugs besser Abstand nehmen sollte, diese Dinge sind offensichtlich "broken by Design" (das hab' ich aus diesem Forum), vermutlich, weil man der Annahme war, unbedingt Destruktoren zu benötigen. Die JVM gibt zur Laufzeit kein einziges Byte mehr an das OS frei (java.nio ist 'ne Ausnahme) sondern nur an den Heap. Die JVM verwaltet Objekte in Scopes welche penibel pro Objekt gemapped weden. Bei Zuweisungen wird geprüft, ob die Scope-Liste des alten Wertes (das gilt natürlich nur für Objekte) noch andere Scopes enthält (Was Scopes sind muss man hoffentlich nicht erklären). ist dies nicht der Fall, wird der Objektspeicher an den Heap zurückgegeben (eine Freigabe an das OS würde btw. den Heapspeicher extrem fragmentieren). Es werden also zu keiner Zeit irgendwelche Destruktoren gebraucht. Hätte gerne mal gewusst, wieso man das in C++ nicht auch so macht - 😳 Moment... war da nicht was mit Operatorüberladung, innklusive Zuweisungsoperator?
@KuhTee:
Fakt ist, dass ca 80 bis 90% der Software auf meinem Rechner (ohne OS) in C++ geschrieben ist.
Und das weis man bei hypothetisch 80 - 90% closed Source Software auf seinem Rechner natürlich genau. Keine Ahnung, warum man mit einem Community-Index vorsichtig sein sollte. Evtl. hat ja wirklich keiner Begriffen, was damals mit der Einführung von C# passiert ist und wieso sich das DotNet-Framework unter Windows nicht mehr (oder nur sehr schwer) deinstallieren lässt (und ich rede hier nicht vom Clientprofile), schon gar nicht die, die 90 - 100% open Source (inkl. OS) auf ihrem Rechner haben, von der man dann auch weis, dass sie in C++ geschrieben wurde. Aber Linux ist nun mal nicht da, wo es sein sollte. In Industrie und Verwaltung herrscht immer noch Windows vor, wo man anscheinend inzwischen auch mehr auf portablen Bytecode setzt.
ist schon aufällig das man bei fast jedem linux dies hier mit installiert hat: Low Level Virtual Machine ? Wikipedia
von den phython scripten die schon eher an programme grenzen zu schweigen.
ist schon aufällig das man bei fast jedem linux dies hier mit installiert hat: Low Level Virtual Machine ? Wikipedia
von den phython scripten die schon eher an programme grenzen zu schweigen.
Heisst das etwa, dass es nicht mal 90 bis 100% C++ auf anderen Rechnern ausser KuhTees sein können? Ich hab' das ehrlich gesagt nur über seine Zahlen geschätzt. Und nicht nur das. Selbst die Aussage, dass es sich dabei nur um ein OpenSource OS wie Linux handeln könnte war nur geraten. Wenn er damit also Werbung bzw. Überzeugungsarbeit für die C++-Lobby machen wollte, ging der Schuss eindeutig nach hinten los. Mich Unwissenden einfach in die Irre führen... herzlichen Dank. 😉
Ausserdem: Was ich weiter oben bereits für Windows und der Hardware auf der es läuft sagte, gilt auch überall sonst. Maschinen ist es egal, in welcher vom Menschen verständlicheren Sprache ein Programm geschrieben wurde. Solange es die Maschine versteht (und die versteht nun mal nur Maschinencode) gibt's kein Problem.
[EDIT]Wer im übrigen der Meinung ist, ist würde zu viel "nur Annehmen", Raten oder mir schlicht aus dem Ärmel schütteln, darf dies ruhigen Gewissens tun, denn irgendwie liegt ihr damit Richtig. Wen das aber letztendlich Disqualifiziert sei mal dahingestellt. Korrekte Annahmen bewahren einen vor Fehlentscheidungen und von falschen Annahmen lernt man nur dazu.[/EDIT]
Mehrfach wurde hier auf die Platformunabhaengigkeit hingewiesen.
Die soll ja bei Java besser sein. Ich frag mich dann immer, wieso gibt es eigentlich JNI, welches man (meistens) mit C/C++ programmiert, wenn doch Java angeblich platformunabhaengiger ist, als C/C++?
Die ganze Diskussion ist fuern A****, fuer einen guten Entwickler lohnt es sich IMMER, eine neue Sprache zu erlernen. Da muss man imho auch keine Argumente anbringen, eigne Erfahrungen sind einfach essentiell, um sinnvolle Diskussionen fuehren zu koennen.
Guggt man sich heute aber C++ an, so sollte man unbedingt gleich C++11 nehmen.
es geht an der Stelle noch immer um Dispose und native Resourcen - das wo die JVM bzw. .NET nicht ran darf um es umherzuschieben und man es manuell aufräumen muss
Hätte gerne mal gewusst, wieso man das in C++ nicht auch so macht
Keine Ahnung, was du meinst... MMU? Paging? Sonstwas? Damit hat man doch in der JVM gar nichts zu tun. Schlage vor, du liesst dich da noch mal selber ein. 😉
Wann immer man in Java ein Objekt zuweist, sind stets 2 Objekte involviert, nämlich das ursprüngliche und das neue. Die JVM holt sich also das aktuelle Object der Variable und das Scope in welcher die Variable definiert wurde. Aus einer Art [c]Map<Object, Set<Scope>>[/c] holt sich die JVM anschliessend die Scopes in welchen das Objekt zugewiesen wurde und entfernt das vorher ermittelte Scope aus dieser Liste. War es das letzte, kann das Objekt abgeräumt und der Speicher an den Heap zurückgegeben werden. Das geht alles noch recht fix. Die einzige Arbeit, die der GC nun noch hat, ist den Heap öfters mal zu defragmentieren. In C++ kann man diese "Halbautomatik" bei Zuweisungen natürlich vergessen, weil sich Operatoren inkl. des Zuweisungsoperators überladen lassen.
Und was genau meinst du mit nativen Resourcen, die man "von Hand" freigeben muss? Dateien? Grafikspeicher? Keine Ahnung. Das Betriebssystem wird jedenfalls schon beim Abräumen eines Objekts von der JVM über nicht länger benötigte Ressourcen benachrichtigt und das ohne das man "finalize()" usw. aufrufen muss. Es wird sogar dazu geraten "finalize()" und Zeugs komplett zu Vergessen, weil halt "Broken by Design". -> The Secret Life Of The Finalizer: page 1 of 2
@Schalentier: Plattformunabhängigkeit hatten wir doch vor gar nicht all zu langer Zeit in einem anderen Thread geklärt, oder war das nicht hier? Jede Sprache ist ansich Plattformunabhängig, solange ein Kompiler für die jeweilige Platfform existiert. Bytecode ist insoweit Plattformunabhängig, solange darauf Frameworks laufen, die diesen Bytecode verstehen (Portabilität).
Statt finalize macht btw nen Phantomreference sinn um natives freizuräumen. Oder halt doch nen gutes altes dispose(). Wobei der meiner meinung nach wirklich wichtige unterschied ist einfach die sache dass man in java keine wildpointer haben kann. Das vereinfach das debugging von sehr großen projecten enorm. Zusammen mit den stacktraces wäre das mein arguemnt für java. c++ hat vorteile wenn es auf details ankommt. Zb physicengine wo man durch tricks etwas pro berechnung sparen kann und sich das über alles start aufaddiert.
Letztendlich kann man mit c/c++ btw auch gut platformunabhängig arbeiten. Man darf halt nur nichts platformspezifisches importieren.(oder packt sich ne middleware dazwischen) Der größere unterscheid ist, das man bei c für alle ziele compiliert und bei java für die jvm.
Jeder Compiler hinterlässt Spuren. Sei es im Code oder in den Abhängigkeiten. Und wenn ein großer Teil der Software schon Abhängigkeiten zur msvcrt.dll hat, dann brauch man da nicht lange raten.
Laut diesem Index steht Obj-C in der Wichtigkeit direkt hinter Java. Ist das realistisch? Eher nein. Der Index spiegelt vor allem auch Hypes wieder, wie eben bedingt durch den aktuellen Apple-Hype die Notwendigkeit von Obj-C. Aber die Welt besteht nicht nur als "Apps". Der Index zeigt auch, dass viele Informatiker mir schlechten Java Kenntnissen die Uni verlassen und nix weiter können. Ok, er "zeigt" es nicht, aber er zeigt das Resultat.
Oh, ich sage keineswegs, dass Java im Vergleich zu C++ eine untergeordnete Rolle spielt. Gerade auch in der Industrie. Nur wie gesagt, die besteht nicht nur aus Webanwendungen 😉 Und auf dem User-PC, auf dem sich eine nicht unerhebliche Menge an Spielen befindet, ist C++ schon nahezu automatisch vorherschend. Eben durch die Games.
C ist eine angenehm zu programmierende Sprache, gerade für Low-Level Arbeiten. Habe damit auf dem GBA programmiert, und das macht schlichtweg Spaß. An der Stelle ist das aber eine Meinung von Torvalds, der viele Entwickler NICHT zustimmen. Man kann in C auch richtig beschissen programmieren, muss man sich nur mal sowas wie GObject anschauen *brrrrr*
C++ bietet einem ebenfalls diese Möglichkeit. Ohne dass irgendwelche besonderen Anstrengungen nötig wären. Allerdings sind (wie bei Java) viele C++ Entwickler schlichtweg keine sonderlich guten Entwickler. Auch da herrscht häufig die Meinung "Hauptsache es läuft" vor. Wer in C++ dangling pointer produziert, kann schlichtweg nicht programmieren. Das schlimme ist ja, dass derjenige nichtmal nur unfähig ist, nein, sondern schlichtweg zu faul einfach einen Smartpointer zu verwenden. Welche das typische Ressourcen Problem (was Java ja hat) ungemein elegant löst.
Du willst Dich ja noch nicht mal damit auseinanders setzen. Das hat auch was mit der JVM am Hut, die JVM macht es selber. Aber darum geht es nicht. Ich wollte Dich eigentlich darauf hinweisen das Hauptspeicher in einem handelsüberlichen PC seit Jahren (Jahrzehnten?) nicht mehr fragmentiert wird. Ich hatte Dich auch an anderen Stellen auf entsprechende externe Quelle hingewiesen das Deine Informationen etwas falsch sind. Aber da hast Du auch nicht entsprechend reagiert.
Wenn du meinst. Ich erkenne nur leider keinen Unterschied zwischen deinem zuletzt gesagten und meinen Äusserungen. Ganz genau, die JVM macht das selber und ich hab' sogar geschrieben wie sie das macht, aber egal (das Ganze heisst Mark and Compact Algorithmus). Also vergiss' diesen Destruktor-Blödsinn. Lt. meinem Link (du hast ihn dir nicht angesehen, oder?), wird bei "finalize()" mehr Speicher belegt gehalten als freigegeben, weil der GC diese Methoden ja auch irgendwann mal aufrufen muss.
Ach und Speicher fragmentiert nicht mehr? Das ist toll, dann benötigt man ja GC überhaupt nicht mehr. Obwohl eigentlich klar sein dürfte, dass wenn ich irgendwo im belegten Speicher mitten drin ein Objekt entsorge, ich schon mal 2 Fragmente bekomme (Mark and Sweep Algorithmus), da kann auch deine MMU oder dein Paging nicht gegen an. Ohne GC wäre man jetzt ganz schön arm dran. Ich frage mich, wessen Informationen hier falsch sind.
Naja egal... ich bin raus.
warum einen Flamewar starten wer die beste Religion... ähm Sprache hat?
Viele "Argumente" in diesem Thread sind nix weiter als Quatsch oder im besten Falle Trolling ("Warum man C++ lernen sollte? Nun, um richtig programmieren zu lernen natürlich Viele Java Entwickler haben null Ahnung, wenns mal etwas technisch tiefer gehen soll"), wer das nicht glaubt solle mal Empire Phoenix link folgen (Linus Torvalds: Why C++ Sucks | CIO Blogs) und ein bisschen drüber nachdenken was damit gemeint sein könnte...
C, C++, C#, Groovy, JavaScript, Ruby, etc. pp. sind alles Sprachen die den "Horizont" erweitern können aber nicht müssen, aber da gibt es ja noch viel mehr.
Alles in allem bitte freundlich bleiben und immer daran denken:
EIn Javaentwickler ist nicht automatisch schlauer/schöner/besser als ein Assembler Entwickler und umgekehrt.
Ich bin beruflich von C++ auf Java übergestiegen.
C++ bietet durchaus Vorteile, z.B. ist es meiner Meinung nach bequemer als Java.
Aber eigentlich gibt es kaum etwas in C++, was man mit Java nicht auch programmieren könnte, zumindest in der endgültigen Funtionalität, jedoch ist es unter Umständen schwieriger.
Hingegen gibt es wieder Fälle, in denen es umgekehrt ist.
Ob es sich in Endeffekt lohnt, muss wohl jeder für sich selbst entscheiden, aber wenn du die Zeit & Gelegenheit hast C++ zu lernen, warum solltest du sie dann nicht auch nutzen, es kann nur Vorteile bringen 🙂
C++ bietet durchaus Vorteile, z.B. ist es meiner Meinung nach bequemer als Java.
Aber eigentlich gibt es kaum etwas in C++, was man mit Java nicht auch programmieren könnte, zumindest in der endgültigen Funtionalität, jedoch ist es unter Umständen schwieriger.
Hingegen gibt es wieder Fälle, in denen es umgekehrt ist.
Ich denke mal, das könnte durchaus an einer gewissen Vorbelastung liegen. Wenn man mit Java in die Programmierung eingestiegen ist, kann es halt passieren, dass man in C++ zu viel Java denkt, umgekehrt natürlich genauso. Deswegen trietzen sich Entwickler verschiedener Lobbies wohl auch immer, weil ihnen das Verständnis der jeweils anderen Sprache fehlt. Umdenken? Hat schon mal jemand versucht 'nem Linkshänder Rechtsschreiben beizubringen? Hab' ich (selber Linkhänder) mal versucht und das hat zumindest nicht funktioniert.
Eines ist jedenfalls sicher, die Zukunft liegt im portablen Bytecode mit wenig nativen Code. Ich meine auch, dass es möglich sein sollte, mit C++ Bytecode zu erstellen und mit Java (mit GCJ lt. Empire Phoenix anscheinend definitiv) halt auch nativen Code. Man benötigt doch eigentlich nur den richtigen Target-Kompiler. Die Annahme stützt sich darauf, dass C/C++ Kompiler für allerlei Zielsysteme (z.B. Arduino oder dem was mogel sagte) existieren. Faktisch müssen die Kompilationen nur vom jeweiligen Zielsystem verstanden werden und das diese Zielsysteme keinesfalls Quelltexte irgendeiner Form verstehen, ist wohl auch klar.
Portabler Bytecode hat sicher eine ganze Menge Vorteile. Jedoch ist bei uns gerade die Situation so,
dass wir in den letzten Jahren viel in Java geschrieben haben (angefangen hab ich selber mit Delphi),
aber die Zielsysteme in aller Regel Windows-basiert waren. Das heisst, die ganze schöne Portabilität haben wir kaum genutzt, mussten aber immer wieder feststellen, dass Java gewissermassen in einer Art "Paralleluniversum" auf einer Windows Maschine läuft, was zwar lösbare, aber doch sehr lästige Probleme machte.
Demnächst wird also .NET/C# angesagt sein bei uns, auf diese Umstellung bin ich optimistisch gespannt. Zum Ausgangsthema: eine andere Progr.Sprache zu lernen, kann meines Erachtens nur Vorteile haben. Das Zeitaufwand/Nützlichkeit-Verhältnis muss jeder für seinen Bereich selber bestimmen.
Die Diskussion über dispose() und Destruktoren (die es ja z.B. in Delphi notwendigerweise geben muss) fand ich noch recht interessant. dispose() hab ich selber in Java noch nie gebraucht (und das JFrame.DISPOSE_ON_CLOSE zähle ich mal nicht dazu), das heisst aber natürlich nicht, dass es niemals gebraucht würde (es wird ja mitunter gebraucht, wie hier schon erläutert wurde). Streams muss man ja z.B. auch von Hand schliessen in Java, das nimmt einem ja auch niemand ab... GC ist schon nett, dennoch muss man einiges beim Beenden beachten.
Bei meinen ersten Monaten mit Java habe ich einige Dinge schlichtweg gehasst, vor allem GUI Programmierung mit Swing. GridBagLayout (ohne geht es oft nicht), Glues, Struts, constraints und was es sonst noch alles gibt, du liebe Zeit... :rtfm: Ein GUI, das man mit Delphi in 2 h erstellt hat, braucht x-mal solange in Swing und sieht immer noch "naja, schön ist anders" aus...
Die reine OOP-Seite von Java ist jedoch durchaus elegant (wenngleich ich manchmal "freischwebende" Utility-Methoden wie in Delphi vermisst habe, aber das ist nur ein geringes Manko). Sogar an den vielgescholtenen Generics kann ich derzeit nicht viel Schlimmes entdecken, wenn man sie in Maßen verwendet (obwohl ich auch schon Code gelesen habe, den ich bei bestem Willen nicht mehr kapiert hab, der wimmelte nur so von <> Klammern).
Jedoch ist bei uns gerade die Situation so,
dass wir in den letzten Jahren viel in Java geschrieben haben (angefangen hab ich selber mit Delphi),
aber die Zielsysteme in aller Regel Windows-basiert waren. Das heisst, die ganze schöne Portabilität haben wir kaum genutzt, mussten aber immer wieder feststellen, dass Java gewissermassen in einer Art "Paralleluniversum" auf einer Windows Maschine läuft, was zwar lösbare, aber doch sehr lästige Probleme machte.
Das habe ich bei uns im Unternehmen in einer anderen Abteilung auch schon bemerkt. Lustig ist es, wenn es dann eine in C++ geschriebene "Launcher" EXE gibt 🙂
Übel wird es aber dann, wenn in Java geschriebene Software nicht mehr unter Linux läuft, weil die Abhängigkeiten zu Windows so gross geworden sind und nicht ausreichend abstrahiert wurde.
Sogar an den vielgescholtenen Generics kann ich derzeit nicht viel Schlimmes entdecken, wenn man sie in Maßen verwendet (obwohl ich auch schon Code gelesen habe, den ich bei bestem Willen nicht mehr kapiert hab, der wimmelte nur so von <> Klammern).
Es geht bei der Kritik an den Generics ja auch nicht um die Verwendung in Maßen, sondern um die extreme Unzulänglichkeit, insbesondere wenn man C++ Templates kennt. Im Endeffekt sind Java Generics nämlich nichts weiter als vom Compiler bzw der VM übernommenes automatisches Casting. Mit all den daraus resultierenden Problemen bzw Dingen die einfach in Java nicht machbar, in C++ aber ganz und gäbe sind (mit "nicht machbar" beziehe ich mich konkret nur auf Generics, das ist keine allgemeingültige Aussage).
Die reine OOP-Seite von Java ist jedoch durchaus elegant (wenngleich ich manchmal "freischwebende" Utility-Methoden wie in Delphi vermisst habe, aber das ist nur ein geringes Manko). Sogar an den vielgescholtenen Generics kann ich derzeit nicht viel Schlimmes entdecken, wenn man sie in Maßen verwendet (obwohl ich auch schon Code gelesen habe, den ich bei bestem Willen nicht mehr kapiert hab, der wimmelte nur so von <> Klammern).
Also beim besten Willen, aber als elegant wuerde ich Java's OOP Konzept nun wirklich nicht bezeichnen. Es ist furchbar starr, unglaublich geschwaetzig und nicht wirklich konsistent.
Gugg dir z.B. mal Ruby (die Sprache, nicht unbedingt gleich Rails) an. Oder auch sehr interessant: Coffeescript. Beiden gemein ist, dass man Klassen und Objekte im Code veraendern kann. Genau das, wofuer man bei Java "Addons" braucht (asm oder AspectJ) braucht.
Der Effekt der dadurch eintritt ist, dass man keine riesigen (oder unglaublich viele) starre Klassen schreibt, sondern eher Code-Bausteine, die dann in einer Anwendung (oder im Test) zusammenkonfiguriert werden. Dadurch ist es viel einfacher, einzelne "Features" an einer Stelle zu buendeln, anstatt den Code ueber viele andere Stellen verteilen zu muessen. Das find ich deutlich eleganter.
Im Endeffekt sind Java Generics nämlich nichts weiter als vom Compiler bzw der VM übernommenes automatisches Casting. Mit all den daraus resultierenden Problemen bzw Dingen die einfach in Java nicht machbar, in C++ aber ganz und gäbe sind (mit "nicht machbar" beziehe ich mich konkret nur auf Generics, das ist keine allgemeingültige Aussage).