Java equals Funktion im Konstruktor - wie richtig?

palaber

Captain
Registriert
Juni 2006
Beiträge
3.856
Hallo Zusammen,
ich hab schon wieder ein neues Problem, hoffe ich geh euch damit nich zu sehr auf S...enkel.
Und vielen Dank vorab für die Hilfe!

Jetzt zum Problem:
Ich habe die Aufgabe mehrere Punkte(x/y) zu setzen und mit diesen ein Dreieck(p1/p2/p3) zu erzeugen. Es soll eine Fehlermeldung ausgegeben werden wenn die Fläche eines Dreiecks <0 ist.
Dies ist doch der Fall sobald p1=p2=p3 ist, oder?
Sobald von einem Dreieck also die Punkte p1=p2=p3 sind sollte eigentlich ne Exception geworfen werden, bei mir tut das so aber nicht, leider weiß ich nicht warum.
Das ganze sieht so aus:

Klasse Punkt:
Code:
package geometrie;

public class Punkt {
		
		private int x=0;		// Setzt X-Koordinate 
		private int y=0;		//Setzt Y-Koordinate
		
		
		//Getter & Setter
		public int getX() {
			return x;
		}
		
		public void setX(int x) {
			this.x = x;
		}
		
		public int getY() {
			return y;
		}
		
		public void setY(int y) {
			this.y = y;
		}
	
		// Konstruktor
		public Punkt(int x, int y){
			setX(x);						//setzt X-Wert
			setY(y);						//setzt Y-Wert
		}
		
		@Override
		public String toString(){
			return +x+"/"+y+"  ";
		}
		
	
}

Klasse Dreieck:
Code:
package geometrie;

public class Dreieck {


	private Punkt p1,p2,p3;

	//Getter&Setter
	
	public Punkt getP1() {
		return p1;
	}

	public void setP1(Punkt p1) {
		this.p1 = p1;
	}

	public Punkt getP2() {
		return p2;
	}

	public void setP2(Punkt p2) {
		this.p2 = p2;
	}
	
	public Punkt getP3() {
		return p3;
	}

	public void setP3(Punkt p3) {
		this.p3 = p3;
	}
	
	//Konstruktor	
	
	public Dreieck(Punkt p1, Punkt p2, Punkt p3){
		setP1(p1);
		setP2(p2);
		setP3(p3);
		if(p1.equals(p2) && p2.equals(p3) && p1.equals(p3)){
			throw new RuntimeException("Die Fläche des Dreiecks Beträgt 0 - Bitte andere Werte eingeben");
		}
	}

Main:
Code:
package geometrie;

public class TestGeo {

	public static void main(String[] args) {
		
			Punkt p1=new Punkt(0,10);
			Punkt p2=new Punkt(5,5);
			Punkt p3=new Punkt(10,5);
			Punkt p4=new Punkt(15,10);
			Punkt p5=new Punkt(20,0);
			       //Punkt p6=new Punkt(-5,5);
			Punkt p7=new Punkt(-15,5);
			Punkt p8=new Punkt(-15,5);
			Punkt p9=new Punkt(-15,5);
			
			Dreieck d1= new Dreieck(p1,p2,p3);
			Dreieck d2= new Dreieck(p3,p4,p5);
			Dreieck d3= new Dreieck(p7,p8,p9);
						
			System.out.println(d1);
			System.out.println(d2);
			System.out.println(d3);
		
	}
}
 
[Soweit ich weiß, muss das "==" sein] Hab das Prog. gerade erst gecheckt.. mom
Was kommt denn für ein Fehler?
In der if-Abfrage müsste doch "&&" durch "||"(Oder) ersetzt werden oder?
Es ist doch so, dass nur einer dieser Fälle eintreten muss, damit das 3Eck eine Fläche von 0 besitzt.
 
Zuletzt bearbeitet:
So schauts aus, in dem Falle x und y überprüfen und das Ergebnis davon zurückgeben. Ansonsten gibt dein equals nur true zurück, wenn beide Objekte identisch sind.
 
man muss halt dazu wissen, dass in JAva jede Klasse, die kein extends im Klassenkopf hat, automatisch von "Object" erbt - wird häufig vergessen zu erwähne...

also sowas:
Code:
public boolean equals(Punkt p) {
   return (p.getX==X && p.getY==Y);
}
kansnte natürlich auch gern ausführlicher schreiben ;D
 
jo genau, woher soll equals wissen was verglichen wird, wenn es nicht überschrieben wurde, kennt deinen Punkt ja nicht :-).
Außerdem kann es doch schon kein Dreieck geben, wenn zwei Punkte gleich sind?
 
Ohne da Programm angeschaut zu haben, ist die Fläche eines Dreiecks auch dann gleich Null, wenn nur zwei Eckpunkte aufeinanderliegen (P1=P2 v P1=P3 v P2=P3)
 
Allgemein vermeide ich das Werfen von Exceptions in Konstruktoren.
Führt in meinen Augen zu Problemen bei subclassen.
In so einer Situation kannst im Konstruktor direkt die Variablen zuweisen und musst ned die setter callen.
Des weiteren noch ein Hinweis (hat zwar nix mit dem Problem zu tun ist sich dessen bewusst zu sein halte ich auch für sehr wichtig) Du übergibst da eine Referenz des Objects und nicht eine Kopie.
Wenn du aus irgend einen Grund eine Kopie willlst empfehl ich eine clone Methode zu schreiben die eine Kopie des Objects erstellt und zurück gibt.

Wenn ich ned irre solltest du wenn du schon im Konstruktor eine Exception wirfst eine IllegalArgumentException werfen.

Ansonsten wie schon gesagt stimmt die if abfrage nicht.
Lies dir vielleicht mal den Wikipedia Artikeln zur Mengenlehre durch.
Mengenlehre ist ungemein wichtig das muss sitzen sonst hast immer wieder Probleme.

Überleg dir vielleicht einmal warum folgendes gilt:
Wahrscheinlichkeit von x -> P(x)
P(avb)=P(a)+P(b)-P(a & b)
 
Funart schrieb:
Ansonsten wie schon gesagt stimmt die if abfrage nicht.
Lies dir vielleicht mal den Wikipedia Artikeln zur Mengenlehre durch.
Mengenlehre ist ungemein wichtig das muss sitzen sonst hast immer wieder Probleme.

Überleg dir vielleicht einmal warum folgendes gilt:
Wahrscheinlichkeit von x -> P(x)
P(avb)=P(a)+P(b)-P(a & b)

naja DAS ist aber nicht mengenlehre sondern wahrscheinlichkeitstheorie :P
 
Hängt aber zumindest in diesem Fall eng zusammen:
|A ∪ B| = |A| + |B| - |A ∩ B| :)
 
Ich hab das als Wahrscheinlichkeit geschrieben dass es leichter verständlich ist.
Aber kriegts nenn keks für i-tüpferl reiten ;)
 
wollt dich doch nur bissl ärgern ;P
aber eins würd mich intressiern: aus welchem grund findest dus mit wahrscheinlichkeiten leichter als mit mengen zu verstehen?
 
Ups, das mit den 2 Punkten stimmt natürlich, so spät in die Nacht hinein zu programmieren ist einfach doch nicht soooo sinnvoll. Deshalb fange ich heute jetzt schon an ;)

An die equals Methode hab ich gedacht, nur hab ich die irgendwie noch nicht so geblickt.
Also mit dem @Override... bei der toString is dafür verständlich...
Naja, bin ja noch blutiger Anfänger, da muss man noch einiges lernen.
Also dann danke soweit erst mal und ich werde versuchen mich da durch zu beißen.
 
palaber schrieb:
Ups, das mit den 2 Punkten stimmt natürlich, so spät in die Nacht hinein zu programmieren ist einfach doch nicht soooo sinnvoll. Deshalb fange ich heute jetzt schon an ;).

Die Fläche des Dreiecks ist darüber hinaus auch dann 0, wenn alle 3 Punkte auf derselben Geraden liegen.
 
Also ich hab jetzt mal versucht die Equals zu Überschreiben, leider klappt das bei mir nicht so wie oben beschrieben.

also sowas:
Code:
Code:
public boolean equals(Punkt p) {
   return (p.getX==X && p.getY==Y);
}

Hab auch noch ein paar Änderungen versucht, aber irgendwie klappt das nicht, man da bekommt man ja die Kriese... ich glaub programmieren is nix für mich :(


So jetzt bin ich dann total verwirrt... soweit hab ichs gebracht, weiß aber selbst nimmer was ich davon halten soll:

Code:
	//Konstruktor	
	
	public Dreieck(Punkt p1, Punkt p2, Punkt p3){
		setP1(p1);
		setP2(p2);
		setP3(p3);
		if(p1.equals(p2) | p2.equals(p3) | p1.equals(p3)){
			throw new RuntimeException("Die Fläche des Dreiecks Beträgt 0 - Bitte andere Werte eingeben");
		}
	}
	
	@Override
	public boolean equals(Object o){
		if(p1.equals(p2) | p1.equals(p3) | p2.equals(p3)){
			Dreieck d=(Dreieck)o;
			return (d.getP1().equals(getP2()) | d.getP1().equals(getP3()) | d.getP2().equals(getP3()));
		}
		return false;
		
	}

Geh jetzt mal was essen... hoffe danach nen größeren Durchblick zu besitzen!
 
Zuletzt bearbeitet:
außerdem ghört da ned | sondern ||...überall...equals ghört in die klasse punkt
und nimm das von oben...das is besser
 
Eclipse und co. generieren dir equals übrigens automatisch wenn du magst.

Code:
@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			Punkt other = (Punkt) obj;
			if (x != other.x)
				return false;
			if (y != other.y)
				return false;
			return true;
		}

Außerdem ist bei equals stehts der Typ Object als Parameter anzugeben, sonst überschreibt man garnichts.
 
Die equals hatte ich in Dreieck drin. Bin gerade dabei das in Punkt auszuprobieren.

Nehme ich exakt das:
Code:
public boolean equals(Punkt p) {
   return (p.getX==X && p.getY==Y);
}
Kommt die Fehlermeldung: "the method equals(Punkt) of type Punkt must override or implement a supertype method" - was bedeutet den das schon wieder?
 
Es bedeutet das, was carom in seinem letzten Satz schrieb: die Methode equals muß als Argument ein Object haben, keinen Punkt. Du könntest sie z. B. so implementieren:

Code:
@Override
public boolean equals(Object other) {
    if (this == other) return true;
    if (!(other instanceof Punkt)) return false;
    Punkt p = (Punkt)other;
    return (p.getX() == x && p.getY() == y);
}
 
Zurück
Oben