C++ | Java
-
Original erstellt von Shade Of Mine:
**
result=value.sqrt();liest sich auch viel besser als ein
result=math.sqrt(value);
(**BTW: Mit Java 1.5 werden statische Imports eingeführt. Damit kann das dann so aussehen:
result=sqrt(value);
...also so ähnlich, als ob da in C++ vorher sowas wie "using namespace blah" stehen würde.
[ Dieser Beitrag wurde am 09.05.2003 um 19:00 Uhr von Gregor editiert. ]
-
zitiere mich bitte ganz.
ich sagte: weil math zufällig auch was anderes sein kann.
zB Maxi Hubers neue supa dupa geile library.ob statische imports der sprache gut tun würde ich bezweifeln...
ein using namespace std; schreibe ich höchstens aus faulheit.das einzige was sinnvoll ist (obwohl ichs auch nicht verwende) ist using std::string; (oder dergleichen)
IMHO verleitet das dazu schlampig zu werden und vorallem verleitet es dazu den sinn von namespaces zu umgehen...
-
Original erstellt von Shade Of Mine:
**zitiere mich bitte ganz.
**OK:
Original erstellt von Shade Of Mine:
**was wenn ich nämlich math nicht kenne? (weil es uU nicht math sondern foobar ist - und das ist was total super tolles was nicht jeder kennt) - dann würde ich verzweifelt nach der foobar deklaration suchen
**...dann hast du Glück, dass Java ausgezeichnet dokumentiert ist. So findest du meistens in kürzester Zeit, was du brauchst.
...und solche Funktionen, wie sqrt findet man ja sowieso in jedem Standard-Javabuch im Inhaltsverzeichnis. <- (Dieser Satz bezieht sich nur auf dein Beispiel)
-
wenn es dann gefinkelter wird macht es auch mit C++ und allen feinheiten davon (Templates, namespaces, STL, destruktoren, ....) mehr spass und ist auch sinnvoller
ich weiß zwar nicht was "gefinkelter" bedeutet, aber die von dir aufgezählten Dinge sind mit Ausnahme von Templates (und das solls angeblich bald ebenfalls in Java geben) alles Sachen für die es in Java was Äquivalentes gibt:
namespaces -> Klassen und Packages
STL-> java.util und andere Teile des JDKs
Destruktoren -> Methode finalize
-
Also ich weiß nicht. In Java werden Classen als Namespace missbraucht. Wie grausam. Programmiert auf keinen Fall Java, die benutzen einen Trick, weil die Sprache ein Feature nicht unterstüzt.
Oh. Und bitte programmiert alle kein C++, weil da unmengen an Tricks verwendet werden, um irgendwelche Features, die man gerne hätte nachzubauen. Beispielsweise bei www.gotw.ca findet man eine ganze menge davon, aber auch hier im C++-Forum wurde schon öfters soetwas diskutiert (bsp. Überladung anhand der Rückgabe).
Ich glaube ich sollte komplett aufhören zu Programmieren, da es wohl keine Sprache gibt, in der es alle Features gibt, die ich vielleicht mal brauchen könnte.
-
btw. wenn ja streng OOP wär, dann sollte ja folgendes gehen
1.add(2)
weil 1 ja eigentlich eine Instanz von int sein sollte
in den totalen OO Sprachen wie Smalltalk und Ruby ist das ja so!
-
Dafür hat Java aber entsprechende Wrapper Klassen.Man kann jetzt darüber streiten ob ein Wert auch gleichzeitig ein Objeckt sein sollte. In anderen OOP Sprachen sind auch ganze Codefragmente ein Objekt. Kennt C++ auch nicht!
Ist ohnehin ne Diskussion ohne EndeMfG Spacelord
-
namespaces -> Klassen und Packages
STL-> java.util und andere Teile des JDKs
Destruktoren -> Methode finalizenamespaces und Packages unterscheiden sich schon etwas
einfachstes beispiel: du kannst nicht sagen use "Package" in java
du kannst es nur importieren
und sobald du jede Menge Packages.* inkludierst
kann es schon vorkommen das du zB
Element el = e.getElement(1);
machst und der compiler liefert ambiguous Class Name Element - org.w3c.dom.Element und irgendwas.sax.Element gibt es da zum beispielich weiss schon das man eigentlich nichtmit .* importieren sollte und mache es auch nicht - nur ein beispiel
in C++ wuerde ich zB namespace org.w3c.dom nehmen und das funktioniert dann schon
STL-> java.util und andere Teile des JDKs
stl und java.util kann man nun nicht ganz vergleichen da die STL ja die standard template libary ist und java wie du auch sagst keine templates unterstuetzt - und templates sind schneller als die nutzung genereller klassen
ausserdem spart man sich das ganze castenDestuktoren und finalize sind fuer mich unterschiedlich
da ich in finalize ja keinen speicher freigebe
ich mache nur abschluss arbeiten vor dem entladen
in C++ jedoch sage jedoch auch ich was ich freigeben will (und muss)
und weiss genau wann welcher speicher freigegeben ist
und das ist bei geringem speicherverbrauch halt wichtig
die GC schluckt halt zeit und speicher als auch das es laenger dauert bis das ganze freigegeben ist
-
die GC schluckt halt zeit
Der GC schluckt so gut wie keine Zeit. AFAIK ist der GC in Java sehr effizient.
Siehe zum Beispiel hier: Wie heißt der Nachfolger ...
namespaces und Packages unterscheiden sich schon etwas
einfachstes beispiel: du kannst nicht sagen use "Package" in java
du kannst es nur importieren
und sobald du jede Menge Packages.* inkludierst
kann es schon vorkommen das du zB
Element el = e.getElement(1);
machst und der compiler liefert ambiguous Class Name Element - org.w3c.dom.Element und irgendwas.sax.Element gibt es da zum beispielich weiss schon das man eigentlich nichtmit .* importieren sollte und mache es auch nicht - nur ein beispiel
in C++ wuerde ich zB namespace org.w3c.dom nehmen und das funktioniert dann schon
Ich verstehe nicht ganz, was du hier sagen willst. Stört es dich, dass Java meckert, wenn du Mehrdeutigkeiten in deinen Code eingebaut hast?
Was macht denn C++, wenn du 2 Namespaces mit "using" einbindest, die beide eine Funktion mit dem gleichen Namen beinhalten?
-
Kennt C++ auch nicht!
Jo, C++ ist ja auch nur eine mittel OO Programmiersprache (falls man das überhaupt so einstufen sollte ;)). Mir ging es nur darum, die Behauptung von SUN, dass Java die OO Sprache ist relativieren.
Ist ohnehin ne Diskussion ohne Ende
Ja und die wird auch immer langweiliger
Was macht denn C++, wenn du 2 Namespaces mit "using" einbindest, die beide eine Funktion mit dem gleichen Namen beinhalten?
namespace A { void foo(void); } namespace B { void foo(void); } using namespace A; using namespace B; //noch kein Problem int main(void) { foo(); //oh oh doppel Deutig A::foo(); //dann so :) (bzw. B::foo(); *rolleyes* ) }
ich bin mir nicht sicher, aber vielleicht geht ja auch der folgende Code, dass man explizit die Funktion in den globalen Namespace holt
using namespace A; using namespace B; using A::foo;
-
int main(void) {
foo(); //oh oh doppel Deutig
A::foo(); //dann so (bzw. B::foo(); *rolleyes* )
}Ach so! Also letztendlich genau das Gleiche, wie in Java.
[ Dieser Beitrag wurde am 11.05.2003 um 15:06 Uhr von Gregor editiert. ]
-
ich dachte eigentlich das in der letzten ueberarbeitung des C++ standard zusaetze zum namespace gemacht wurden wo man auswaehlen kann in welchem namespace man gerade ist
na dann doch nicht
die GC schluckt halt zeit
Der GC schluckt so gut wie keine Zeit. AFAIK ist der GC in Java sehr effizient.also bei der middleware an der ich kurz getunt hatte schluckte die gc schon zeit
- man merkte richtig wenn sie einsetzte (kurzer performance einbruch) und ein paar (zehn)tausend objekte loeschte
ich musste dann mit verschiedensten gc-algorithmen herumtun (java hat ja mehrere) bis das ganze dann richtig smooth gelaufen istaber ich muss sagen das war keine end user anwendung
da war die vorgabe: respondzeiten so kurz wie moeglich damit immer objekt angelegt und geloescht werden koennenauch lege ich zB fuer meine planungsengine die GUI graphisch dynamisch zur laufzeit an und halte die ganzen plan daten im speicher
das sind je nach xml spec fuer nen plan zwischen 20-40 MByte die alle zum start initialisiert werden muessen weil sie alle voneinander abhaengen und das auf einem enduser rechner - dementsprechend muss das ganze auch auf nem P2 gut laufen - und mindestanforderung ist 64 MByte RAM - mit OS und dem dynamischen start screen - das heisst haendische gc aufrufe sonst werden die objekte zu lang im speicher gehaltenregards
gomberl