Warum ist dieses Feld der Klasse Math immutable?

Maik.Neumann

Aktives Mitglied
Hallo,

Ich hätte da mal eine Frage zu der Klasse Math in Java. Es existiert hier ja eine Konstante namens PI, die mit Math.PI aufgerufen wird.

Warum könnte jetzt eine andere Klasse nicht einfach dieses Feld in dieser Klasse überschreiben?

Java:
double d = Math.PI; // hier zeigen MATH.PI und d auf ein- und denselben primitiven Datentyp
d = 8.99; // warum zeigen jetzt d und MATH.PI auf unterschiedliche primitive Datentypen?
Danke und Gruß
 
Java:
double d = Math.PI;

Sorgt nur dafür das
Code:
d
der selbe Wert (nicht der gleiche!) wie
Code:
Math.PI
zugewiesen wird.


Java:
d = 8.99;

Hier änderst du den Wert von
Code:
d
wieder auf etwas anderes, Math.PI hat keine Verbindung mit deinem
Code:
d
daher bleibt der Wert gleich!
 
In Java wird unterschieden zwischen Referenzen und Primitiven.
Primitive werden stets kopiert.

Math.PI ist aber ein double statt Double.
Soweit so gut... 🙂

Double ist zudem immutable, daher ergäbe sich ohnehin der selbe Effekt, als wenn es ein primitiver Wert wäre.
(const ist in Java zwar ein reserviertes Wort, wird aber (noch) nicht genutzt. Deshalb bedient man sich des Immutable-Patterns, da final keine konstanten Objektzustände garantiert)

OO heisst auch Kapselung; keiner, der das ausreichend begriffen hat, wird (GERADE BEI EINER KONSTANTEN) einen dermassen großen Unsinn fabrizieren, ein zustandsmanipulierbares Objekt öffentlich zugänglich zu machen.

Selbst wenn ich eine Klasse bauen müsste, die ein PI öffentlich statisch zur Verfügung stellt, der Typ ein Double sein müsste und Double nicht immutable wäre 🙂, würde ich eine sogenannte defensive Kopie erstellen.

Java:
class Assumed {
    private static final Double PI = ... ; //assumed Double wouldn't be immutable
   
    private Assumed() {}

    public static Double getPi() {
        return new Double(PI.doubleValue);
    }
 }
 
Zuletzt bearbeitet:
Um auf die ursprüngliche Frage zurückzukommen: Math.PI ist immutable, damit niemand auf die Idee kommt PI zu verändern. PI ist eine, soweit bekannt, universumweite Konstante, die sich nie ändern wird. Deshalb macht es überhaupt keinen Sinn Math.PI mutable zu machen. Außerdem ist diese Variable statisch, was bedeutet, dass eine Änderung Auswirkungen auf ALLE Operationen haben wird, die auf Math.PI zugreifen.
 
@TO

ich glaube was du hier nicht verstehst ist folgendes :

du hast in deiner klasse eine referenz "d"

dieser referenz wird die speicher-adresse von Math.PI zugewiesen ... so das dein "d" letzten endes auf genau den speicher zeigt wo durch die Math-klasse PI angelegt wurde

ein paar zeilen später weist du deiner referenz "d" eine andere speicher-adresse zu ... heißt also : dein "d" zeigt dann auf eine andere stelle im speicher


Math.PI selbst bleibt davon aber völlig unberührt und zeigt weiterhin auf genau die stelle im speicher in halt PI erstellt wurde


java ist grundsätzlich call-by-value ... es wird also indern nur mit den speicher-adressen gearbeitet auf die eine referenz zeigt


das was du willst ... über einen eigenen namen etwas fremdes zu verändern würde z.b. in C mit den dort vorhandenen pointern gehen : *d=8.99
das sternchen in C bedeutet das man nicht die adresse ändern will auf die ein pointer zeigt sondern inhalt in dieser speicher-zelle ... was dann call-by-reference wäre ... und genau DAS geht in java zum glück nicht
 
Hallo nochmal,

Wäre Math.PI jetzt aber ein Objekt einer beliebigen Klasse, so wäre es aber nicht immutable.

Kann man allgemein sagen, dass Konstanten in Form von primitiven Datentypen, die als final (oder auch static final) deklariert wurden, automatisch immutable sind und beliebige Klasse nicht automatisch immutable sind, auch wenn sie static final oder nur final deklariert wurden?

Danke und Gruß
 
Alle Elemente, die als final gekennzeichnet sind, sind unveränderbar.
Math.PI ist deshalb immutable, weil es final ist.
Z. B. Strings sind auch immutable, was daran liegt, dass sie keine Setter für ihren Inhalt haben.

Deshalb kann, wenn Math.PI ein Element einer beliebigen Klasse wär, Math.PI auch dort immutable sein, so es als final gekennzeichnet ist.


War es das, was du meintest?
 

Zurück
Oben