# Unveränderliche Klasse



## AdiPur (2. Apr 2009)

Hallo,

ich muss folgende Aufgabenstellung lösen:

Eine komplexe Zahl soll durch eine unveränderliche Klasse namens *Complex* dargestellt werden.   Diese Klasse besitzt 2 Datenelemente vom Typ double die den Realteil und den Imaginärteil der komplexen Zahl repräsentieren. Diese Datenfelder werden einmal gesetzt und sollen im Programmverlauf nicht mehr verändert werden können. Benutzen Sie hier die entsprechenden *Modifier* bei der Definition der Datenelemente. 
 Diese Klasse soll die folgenden (öffentlichen) *Methoden* besitzen: 


public Complex add(Complex c), die die Zahl c dazuaddiert und als neues Objekt zurückgibt.
public Complex sub(Complex c), die die Zahl c subtrahiert und als neues Objekt zurückgibt.
public Complex mul(Complex c), die die komplexe Zahl mit einer komplexen Zahl c multipliziert und das Produkt als neues Objekt zurückgibt.
  Der *Konstruktor* hat 2 Parameter vom Typ double, den Realteil und den Imaginärteil der zu erzeugenden Zahl.  
 Zuerst wird eine komplexe Zahl als Startwert eingelesen. Danach werden abwechselnd ein Operator und eine komplexe Zahl eingelesen und die angeforderte Rechenopertion durchgeführt.

Ich bin die Aufgabenstellung nun wie folgt angeganen:

.)Hab zuerst eine Klasse Calculator und Complex definiert
.)In der Complex Klasse sind nun alle Rechenmethoden die verlangt sind, definiert. Ich hab die Datenelemente Realteil und Imaginärteil wie folgt definiert:

```
private final double realPart;
private final double imagPart;
```
Weil laut Aufgabenstellung dürfen sie ja später nicht mehr geändert werden. 
Mein PROBLEM ist jetzt das ich ja abwechselnd ein Operator und eine komplexe Zahl einlesen muss. Das hab ich wie folgt realisiert:

```
while (reader.hasNext()) {
                    // look for the operand
                    if (reader.hasNext()) {
                        char operator = reader.next().charAt(0);
                        // look for real part of the second complex number
                        if (reader.hasNextDouble()) {
                            realZ2 = reader.nextDouble();
                            // look for imaginary part of the second complex number
                            if (reader.hasNextDouble()) {
                                imagZ2 = reader.nextDouble();
                                // pass user values on the second complex number
                                z2 = new Complex(realZ2, imagZ2);
                                // execute the selected operation
                                if (operator == '+') {
                                    z2 = z1.add(z2);
                                } else if (operator == '-') {
                                    z2 = z1.sud(z2);
                                } else if (operator == '*') {
                                    z2 = z1.mult(z2);
                                } else
                                  .........
                }
```
Meine Frage ist jetzt nur weil ich ja folgendes schreibe:


```
z2 = z1.add(z2);
```
und später

```
z1 = z2;
```
dazuzusagen ist noch, dass meine add Methode so aussieht:

```
public Complex add(Complex c) {
        double real = realPart + c.realPart;
        double imag = imagPart + c.imagPart;
        Complex sum = new Complex(real, imag);
        
        return sum;
    }
```
Da ich ja ein neues Objekt vom Typ Complex zurückbekomme sollte ich es doch eigentlich so aufrufen:

```
Complex z1 = new Complex(4.5, 6.7);
Complex z2 = new Complex(6.8, 9.0);
Complex z3;
z3 = z1.add(z2);
```
Weil mit meiner Variante geht doch irgendwie der Sinn der unveränderlichen Klasse verloren, weil ich meine alten Werte überschreibe. Nur mein Problem ist halt das ich mit den Objekt was ich zurückbekomme ja laut Aufgabenstellung weiterrechnen muss.
Habt ihr vl einen Tipp für mich??

Danke


----------



## Marco13 (2. Apr 2009)

Ähm - falls ich jetzt auf die schnelle die eigentliche Frage richtig rausgefiltert habe:

```
z2 = new Complex(realZ2, imagZ2);
...
                                z2 = z1.add(z2);
```
Das ist OK - dort wird kein Objekt verändert. Es wird nur der Referenz "z2" ein neues (unveränderliches) Objekt zugewiesen. Aber verändert wird keins.


----------



## AdiPur (3. Apr 2009)

ja danke das war eigentlich meine Frage. Habs wahrscheinlich bisschen zu kompliziert umschrieben. 
Also stimmt mein Ansatz eigentlich und dann sollte es ja auch keine Probleme mit der verlangten Spezifikation(Aufgabenstellung) bei der Abgabe geben oder?


----------



## Vayu (3. Apr 2009)

nein, du hast es korrekt gelöst


----------

