Methode Seiten tauschen eines erstellten Rechtecks mit Seite A und B

ChrSli5385

Mitglied
Hallo liebe Java Freunde. Ich habe folgende code in Java erstellt. Erfolgreich wird bei abrufen der Methode swapSeiten die Seiten gewechselt, allerdings funktioniert dies nur mit der Angabe des Datentyps double im Methodenrumpf der Methode. Kann mir bitte Jemand sagen warum das so ist?


Java:
public double breite;
public double laenge;

// Konstruktor

Rechteck(double breite, double laenge) {

this.breite = breite;
this.laenge = laenge;

}

// Methode

public void swapSeiten() {

double breite = this.laenge;
double laenge = this.breite;
}
 
Zuletzt bearbeitet:
Hallo,

schon dein Konstruktor ist falsch - das "this" gehört auf die linke Seite, der du etwas zuweisen willst.
Beim Tauschen musst du einen der Werte "zwischenspeichern"!

Gruß
fhoffmann
 
Hi @ChrSli5385 ! Wir bedienen uns eines Tricks:
Java:
public class Rechteck {

	public double breite;
	public double laenge;

// Konstruktor

	public Rechteck(double breite, double laenge) {

		this.breite = breite;
		this.laenge = laenge;

	}

// Methode

	public void swapSeiten() {
		breite = breite + laenge;
		laenge = breite - laenge;
		breite = breite - laenge;
	}

	public static void main(String[] args) {
		Rechteck r = new Rechteck(5, 6);
		r.swapSeiten();
		System.out.println(r.breite + " " + r.laenge);
	}
	
}
 
Und die Enterprise-Lösung wäre:
Code:
public void swapSeiten() {
  DoubleSwapper swapper = DoubleSwapperFactory.newInstance()(
  DoubleSwapResult result = swapper.swap(breite, laenge);
  breite = result.getSecond();
  laenge = result.getFirst();
}
 
allerdings funktioniert dies nur mit der Angabe des Datentyps double im Methodenrumpf der Methode. Kann mir bitte Jemand sagen warum das so ist?

Um auch eine Antwort auf deine Frage zu geben. So sah dein ursprünglicher Code aus, der nicht funktionierte:
Java:
public void swapSeiten() {
    breite = laenge; // Die Breite entspricht jetzt der Länge
    laenge = breite; // du erinnerst dich an der Vorgängerschritt? Breite == Länge?
    // An dieser Stelle haben alle beiden Variablen den Wert von Länge.
}

Und das ist der Code der "funktioniert":
Java:
public void swapSeiten() {
    double breite = this.laenge; // Da ein Typ vorangestellt ist, deklarierst du eine neue Variable "breite", die die Instanzvariable "breite" verdeckt.
    double laenge = this.breite; // hier dasselbe mit "laenge".
    // An dieser Stelle haben die beiden neuen Variablen "breite" und "laenge" die vertauschten Werte.
    // die Instanzvariablen "breite" und "laenge" haben den ursprünglichen Wert.
} // hier endet der Gültigkeitsbereich der neuen Variablen, sie werden wieder zerstört.

Das könnte man reparieren, indem man die neuen Variablen einfach den Instanzvariablen zuweist:
Java:
public void swapSeiten() {
    double breite = this.laenge; // neue "breite" == laenge
    double laenge = this.breite; // neue "laenge" == breite
    this.breite = breite;
    this.laenge = laenge;
}

Tatsächlich reicht es allerdings eine temporäre Variable für den Tausch einzuführen, siehe den Beitrag von @fhoffmann.
 
Das könnte man reparieren, indem man die neuen Variablen einfach den Instanzvariablen zuweist:
Java:
public void swapSeiten() {
    double breite = this.laenge; // neue "breite" == laenge
    double laenge = this.breite; // neue "laenge" == breite
    this.breite = breite;
    this.laenge = laenge;
}

Tatsächlich reicht es allerdings eine temporäre Variable für den Tausch einzuführen, siehe den Beitrag von @fhoffmann.
ich würde sie nur noch in „neueBreite“ oä umbenennen, gefällt mir deutlich besser als die Variante mit temp (noch besser wäre es allerdings, wenn einfach ein ganz neues Rechteck erzeugt wird 🙂 )
 
Und die Enterprise-Lösung wäre:
Code:
public void swapSeiten() {
  DoubleSwapper swapper = DoubleSwapperFactory.newInstance()(
  DoubleSwapResult result = swapper.swap(breite, laenge);
  breite = result.getSecond();
  laenge = result.getFirst();
}
Das geht doch besser:

Java:
DoubleSwapper.swap(breite, laenge, l->laenge=l, b->breite=b);

Wofür gibt es denn das Consumer Interface 😀
 

Zurück
Oben