Unterschied zwischen Double und double, etc.?



  • Hallo!

    Macht es einen Unterschied, ob der Rückgabewert meiner Methode Double oder double ist?:

    public Double Frage(){}
    

    bzw.:

    Double[] Frage(){}
    
    public static double Frage(){}
    

    bzw.:

    double[] Frage(){}
    


  • das eine sind objecte das andere primitive datentypen



  • Double ist eine Klasse
    double ist ein primitiver Datentyp

    Double-Variablen können null sein
    double-Variablen haben immer einen Wert

    Da man nur mit "double" rechnen kann (+, -, /, *, etc), würde ich wann immer möglich "double" einsetzen.



  • Wenn der Rückgabewert einer Methode also Double ist, tritt also zwangsläufig ein Seiteneffekt ein, weil Double ein Objekt ist?



  • MeWe schrieb:

    Wenn der Rückgabewert einer Methode also Double ist, tritt also zwangsläufig ein Seiteneffekt ein, weil Double ein Objekt ist?

    Äh, welcher Seiteneffekt sollte denn eintretten?
    Sog. "Seiteneffekte" treten nur auf, wenn eine Methode an einem Objekt (egal ob Übergabeparameter oder irgendein anderes) Veränderungen macht, die man nicht erwartet hätte oder sollte.



  • MeWe schrieb:

    Wenn der Rückgabewert einer Methode also Double ist, tritt also zwangsläufig ein Seiteneffekt ein, weil Double ein Objekt ist?

    Die Wrapper Double, Integer, Float, ... sind immutable, können also nicht verändert werden. Daher kanns da nicht zu Seiteneffekten kommen.



  • Double ist eine so genannte Wrapperklasse. Objekte dieser Klasse kapseln ein double-Wert und bieten zusätzliche Methoden an. Du kannst seit Java 1.5 den Basistypen (int, double etc.) entsprechende Wrapperklassen zuweisen und umgekehrt.

    Bsp.:

    double d1= 1.6;
    Double dWrapper = new Double(2.4);
    double d2 = dWrapper; // übersetzt der Compiler zu: d2 = dWrapper.doubleValue();
    dWrapper = d1; // übersetzt der Compiler zu: dWrapper = new Double(d1);
    

    Der Compiler transformert diese Zuweisungen zwischen Basistypen und Wrapperklassen wie im Beispiel angezeigt. Dieses (zweifelhafte) neue Feature hört auf den Namen "Autoboxing", kostet (insbesondere innerhalb von Schleifen) viel Zeit (wegen der Codetransformation) und sollte daher grundsätzlich vermieden werden.



  • Ich kann dir an einem praktischen Beispiel erklären wo ich Double etc. benutzt habe:

    Ich habe eine Klasse die sich darum kümmert, dass Daten in korrekter Form in eine DB gespeichert werden. Die klasse hat ein paar Funktionen zum überprüfen ob die relevanten Daten auch richtig gesetzt wurden. Unter anderem ob die Werte überhaupt gesetzt wurden. Mit Double, Integer etc. ist das relativ einfach, da ich einfach auf NULL prüfe. Wenn der Wert != NULL ist, dann wird er gespeichert, sonst eine Exception geworfen.

    Wie aber sollte ich das bei einem double oder int anstellen? Die haben immer einen Wert. Es ist nicht wichtig was diese Daten enthalten (zB. von -12000.1 bis +45000.1) oder sowas. Hauptsache da ist etwas...

    Du kannst dieser Methode einfach keine NULL Werte geben, sie akzeptiert es nicht. Bei allem Anderem muss ich annehmen, dass es korrekt ist (und noch ein paar weitere Checks vornehmen).



  • noobie schrieb:

    Ich kann dir an einem praktischen Beispiel erklären wo ich Double etc. benutzt habe:

    Ich habe eine Klasse die sich darum kümmert, dass Daten in korrekter Form in eine DB gespeichert werden. Die klasse hat ein paar Funktionen zum überprüfen ob die relevanten Daten auch richtig gesetzt wurden. Unter anderem ob die Werte überhaupt gesetzt wurden. Mit Double, Integer etc. ist das relativ einfach, da ich einfach auf NULL prüfe. Wenn der Wert != NULL ist, dann wird er gespeichert, sonst eine Exception geworfen.

    Wie aber sollte ich das bei einem double oder int anstellen? Die haben immer einen Wert. Es ist nicht wichtig was diese Daten enthalten (zB. von -12000.1 bis +45000.1) oder sowas. Hauptsache da ist etwas...

    Du kannst dieser Methode einfach keine NULL Werte geben, sie akzeptiert es nicht. Bei allem Anderem muss ich annehmen, dass es korrekt ist (und noch ein paar weitere Checks vornehmen).

    Das sind aber zwei paar Schuhe. Ich sage ja nicht, dass man die Wrapperklassen nicht nutzen sollte. Die haben durchaus ihre Existenzberechtigung. Ich rate nur dazu, das Autoboxing-Feature mit Vorsicht zu genießen oder ganz zu vermeiden, wenn man sich nicht genau darüber klar ist, was intern da so alles passiert. Man kann sich natürlich etwas Schreibarbeit sparen, aber, wie gesagt, man läuft Gefahr, sehr ineffizienten Code zu produzieren, wenn man Autoboxing allzu unbedacht verwendet.

    Man ganz davon abgesehen erzeugt man auch keinen sauberen Code. Schließlich weißt man (auf den ersten Blick) einem (Basis)Datentypen double eine Klasse Double zu. ..

    Der Einsatz von Wrapperklassen in Deinem Beispiel scheint auf den ersten Blick sinnvoll zu sein. Endgültig beurteilen kann ich's schlecht, weil mir dazu die Hintergrundinformationen fehlen.

    Ein weiterer sinnvoller Anwendungsfall der Wrapperklassen ist das Parsen von Stringausdrücken.



  • @Blackthorne: Ahhh, sorry. Jetzt wo ich es nochmals gelesen habe sieht es so aus als hätte ich das auf deine Antwort bezogen. Das war eigentlich direkt für den Fragesteller gedacht, sollte er nach all den Antworten noch immer nicht allzuviel damit anfangen können.

    Aber auch ich benutze die Klassen fast nie. Ich brauche sie irgendwie einfach nicht.



  • 🙂 OK


Anmelden zum Antworten