Mehrere Konstruktoren

fanta5

Aktives Mitglied
Hi,

angenommen, ich möchte eine Klasse schreiben, die verschiedene Dinge in einem rechtwinkligen Dreieck berechnet.

Dann könnte ein Konstruktor z.b. Seitenlänge A und Seitenlänge B als Parameter erwarten und über unseren Freund Pythagoras die Seitenlänge C errechnen.

Ein weiterer Konstruktor könnte aber auch Seite und Winkel erwarten und über Sinus-/Cosinusfunktion rechnen wollen.

Somit hätte ich 2 Konstruktoren, die beide 2 Parameter als double erwarten, nicht wahr?

Wo liegt mein Denkfehler oder wie löst man sowas?

f5
 

consider

Mitglied
Zwei Konstruktoren mit gleicher Signatur ist schlecht.

Ein Lösungsansatz wäre, eigene Winkel- oder Seitentypen zu verwenden.

Zu bedenken ist auch, wenn du nicht NUR die Seite C im Dreieck als Member speichern willst, dass zwischen den Membern keine Abhängiugkeiten bestehen sollten. Also wenn du A und B hast, macht in der Regel eine Variable für C keinen Sinn mehr und sollte vermieden werden, denn diese kann per Methode errechnet und ausgegeben werden. Dadurch bleibt die Datenintegrität gewährleistet. (Denn wenn du eine Variable änderst musst du sonst immer auch alle anderen ändern, da sie sich bedingen). Vielleicht ist es daher besser, für bestimmte Berechnungen auch spezielle Klassen zu entwerfen, die eine bestimmte Aufgabe haben und nicht eine Universelle.
 
Zuletzt bearbeitet:

Dompteur

Top Contributor
Auf der logischen Ebene ist für dich klar, dass 2 Seitenlängen etwas anderes sind als eine Seitenlänge und ein Winkel.
Wenn du nun auf die Programm/Java-Ebene kommst, dann bildest du aber alles auf den gleichen Datentyp ab. Du verlierst also Information.
Was also auf der logischen Ebene funktioniert, kannst du in Java nicht mehr 1:1 realisieren.

Eine schöne Lösung kann ich dir auch nicht anbieten.
Ad hoc würde ich das über eine Factory-Klasse bzw. eine statische create-Methode lösen.
Denkbar, aber etwas unsauberer wäre bei einem der beiden Konstruktoren einen zusätzlichen Dummy-Parameter hinzufügen.
 

mrbela

Bekanntes Mitglied
Hey!

Generell sind Konstruktoren nicht dazu da um Sachen zu berechnen.. Sondern vielmehr um Objekte (z.B. ein Dreieck) zu erstellen.. Die Berechnungen innerhalb eines Dreiecks (oder auch mit einem zweiten) sollte dann eher in Methoden stattfinden! Dazu sind Methoden auch schließlich da. ;)

Mit der "Überladung" kriegst Du hier auch kein Problem, da Du einfach die beiden Methoden unterschiedlich benennst. So entsteht auch kein Konflikt, wenn sie die gleiche Signatur (Anzahl und Typ der Parameter) haben!

Liebe Grüße
 

stg

Top Contributor
Generell sind Konstruktoren nicht dazu da um Sachen zu berechnen.. Sondern vielmehr um Objekte (z.B. ein Dreieck) zu erstellen.. Die Berechnungen innerhalb eines Dreiecks (oder auch mit einem zweiten) sollte dann eher in Methoden stattfinden! Dazu sind Methoden auch schließlich da. ;)

Kann man so pauschal nicht sagen. Wenn ich etwa einen Immutable Typen habe, nur verhältnismäßig selten eine Instanz erstelle, aber sehr oft auf abgeleitete Attribute zugreife, kann es durchaus Sinn machen die "abgeleiteten" Attribute vorzuhalten und beim Erstellen der Instanz nur einmalig zu berechnen.
Oder auch, um ein weiteres Beispiel zu nennen: Beim Aufruf von .size() auf einer Liste, würde ich zunächst immer von konstanter Laufzeit ausgehen. Bei einer LinkedList müsste ich sonst ja z.B. immer die gesamte Liste durchlaufen, wenn das Attribut nicht extra vorgehalten werden würde, auch wenn es redundant ist.
 

Dompteur

Top Contributor
Generell sind Konstruktoren nicht dazu da um Sachen zu berechnen.. Sondern vielmehr um Objekte (z.B. ein Dreieck) zu erstellen.. Die Berechnungen innerhalb eines Dreiecks (oder auch mit einem zweiten) sollte dann eher in Methoden stattfinden! Dazu sind Methoden auch schließlich da. ;)
Aber genau das war ja auch die Frage:
Kann man ein Dreieck erzeugen, indem man verschiedene Informationen zum Dreieck im Konstruktor angibt ?

Ich finde es legitim, ein rechtwinkeliges Dreieck durch 2 Seiten oder 1 Seite und einen Winkel zu erzeugen. Die Konstruktoren wandelt diese Daten dann in eine interne Darstellung.

Die anderen Berechnungen (Fläche,...) gehören natürlich in entsprechende Methoden.
 

Saheeda

Top Contributor
Noch ne andere (dreckige) Variante: Man verwendet float und double, so haben die Konstruktoren unterschiedliche Signaturen.

Java:
	public Triangle(float angle1, float angle2){
		
	}
	
	public Triangle(double angle1, double angle2){
		
	}

Frage an die Profis: Würde das funktionieren oder gibt's hier irgendwelche Seiteneffekte, die ich nicht bedacht habe?
 

fanta5

Aktives Mitglied
Hm... mir gefällt bisher noch Dompteurs "Dummy Parameter Lösung" am besten. Aber sehr schön, so viele Anregungen zum Thema hier zu lesen.

f5
 

consider

Mitglied
So richtig "schön" finde ich die Löungen alle nicht. Ich würde es folgendermaßen angehen:

Zunächst finde ich einen Typ "Winkel" sinnvoll. Das vermeidet gleiche Signaturen und ermöglicht dir auch die Anwendung in anderen geometrischen Figuren. Außerdem kann sehr leicht Vergleichbarkeit mittels equals hergestellt werden, ohne bei doubles jedesmal manuell die Ungenauigkeiten beachten zu müssen. (Beispiel in der Mainmethode)

Also könnte die Winkelklasse z.B. so aussehen:

Java:
package dreieck;

public class Winkel {

	private double grad;
	
	public Winkel(double grad){
		setGrad(grad);
	}

	public double getGrad() {
		return grad;
	}

	public void setGrad(double grad) {
		this.grad = grad;
	}

	
	
	@Override
	public String toString() {
		return "Winkel [grad=" + grad + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		long temp;
		temp = Double.doubleToLongBits(grad);
		result = prime * result + (int) (temp ^ (temp >>> 32));
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Winkel other = (Winkel) obj;
		if (Double.doubleToLongBits(grad) != Double
				.doubleToLongBits(other.grad))
			return false;
		return true;
	}
	
}

Somit ist sicher gestellt, dass gleiche Winkel den gleiche Hash haben und auch per equals immer das korrekte Ergebnis liefern. Dem Winkel ist es dabei egeal, ob er in einem Dreieck oder Viereck benutzt wird, was vielleicht später Arbeit spart.

----

Für das Dreieck würde ich nur die Dinge als Variablen definieren, die zur exakten Bestimmung eines rechtwinkligen Dreieckes mindestens nötig sind. Ich wähle zwei Seiten. Der Rest lässt sich daraus ableiten. So werden Abhängigkeiten in den Membern vermieden und Intergrität ist leichter gewährleistet.

Eine statische Methode "berechneSeite" übernimmt bei Angabe eines Winkels im Konstruktor das Auflösen in eine Seite.

Andersherum gibt "getAplha" nach Berechnung den Winkel aus.

Java:
package dreieck;

public class Dreieck {
	
	private double a;
	private double b;
	
	public Dreieck(double a, double b){
		setA(a);
		setA(b);
	}
	
	public Dreieck(double a, Winkel alpha){
		this(a, seiteBerechnen(a, alpha));
	}

	private static double seiteBerechnen(double a, Winkel alpha) {
		 
		double ergebnis;
		//berechne die Seite
		ergebnis = 2.3;
		return ergebnis;
	}
	
	public Winkel getAlpha(){
		//berechne alpha
		return new Winkel(30);
	}

	public static void main(String[] args) {
		Dreieck dreiEck1 = new Dreieck(100, 100);
		Dreieck dreiEck2 = new Dreieck(100, new Winkel(30));
		
		System.out.println(dreiEck1.getAlpha().equals(dreiEck2.getAlpha()) ? "gleich" : "ungleich");

	}

	public double getA() {
		return a;
	}

	public void setA(double a) {
		this.a = a;
	}

	public double getB() {
		return b;
	}

	public void setB(double b) {
		this.b = b;
	}

}

Die Werte sind hier aus Gründen der Faulheit fest codiert.

So würde ich mich zunächst am wohlsten fühlen. Da hier (und übrigends auch in den anderen Beispielen) niemals klar ist, welcher Winkel und welche Seite (Kathete, Ankathete oder Hypothenuse) nun genau gemeint ist und die Berechnungen daher irgendwie immer schwammig bleiben (und ausserdem gehen dir vermutlich die primitiven Datentypen irgendwann aus oder der Kostruktor ist überfüllt mit Dummies und 100 Zeichen lang), würde ich auch für die Seiten eigene Typen anlegen und den Konstruktor entsprechend überladen, sodass er eben mit jeder Kombination aus Kathete, Ankathete, Hypothenuse, Alpha und Beta usw klar kommt. Dass intern tatsächlich immer nur zwei Seiten deiner Wahl gespeichert werden ist bei der Benutzung der Klasse ja vollkommen transparent.

Die statischen Methoden zur Berechnung des fehlenden Parts sind so ja übrigends auch unabhängig von einem konkreten Dreiecksobjekt zur Dreiecksberechnung benutzbar, was mMn ein weiterer Vorteil ist. Pytagoras kann ja auch sehr gut für Abstandsberechnungen zweier Koordinaten benutzt werden zB. Und dafür ist ein konkretes Dreiecksobjekt überflüssig. Du hast also zusätzlich eine kleine Utilityklasse.

-----

Soweit meine Gedanken dazu. Was haltet ihr davon?
 
Zuletzt bearbeitet:

fanta5

Aktives Mitglied
Hi,

klingt für mich sehr logisch, danke für die Anregungen.
Das heißt also, wir können vorab "Datentypen" erzeugen, die dann später im Konstruktor wiederum als Eingangsparameter genutzt werden können? Dann liest sich das für mich tatsächlich nach der "saubersten" Lösung. Denn so können wir tatsächlich ganz genau sagen, ob und welche Seite bzw. welcher Winkel als Parameter für unsere Konstruktoren "reinkommt".

Habe ich das so korrekt verstanden?

f5
 

consider

Mitglied
Genau das ist die Idee dahinter. Für mich klingt das nach einer soliden Lösung im Sinne der OOP. Ich bin jetzt aber auch kein Java-Geek und selbst interessiert daran, was die Anderen dazu sagen.

Ach ja, bei den Seiten könnte man es sich recht einfach machen. Da ja eine Seite immer nur eine Länge hat, könnte man ein mal eine abstrakte Elternklasse mit diesem Attribut erstellen und dann die konkreten Klassen "Kathete" usw davon ableiten.

Allerdings hätten die abgeleiteten Klassen dann keinerlei eigene Eigenschaften sondern nur die geerbten. Es ginge als ausschliesslich um den Typ. Und da bin ich mir nicht sicher ob das sauber ist, oder ob es da nicht eventuell eine bessere Lösung gibt.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Mehrere Konstruktoren? Wofür? Java Basics - Anfänger-Themen 21
T mehrere Konstruktoren für eine Klasse Java Basics - Anfänger-Themen 7
K Mehrere Werte in einem Switch Case parallel überprüfen Java Basics - Anfänger-Themen 23
S HashMap mehrere Keys zu einem Value Java Basics - Anfänger-Themen 3
T Mehrere if bedingungen ohne & Java Basics - Anfänger-Themen 2
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
MiMa Java Doc mehrere Return Parameter Java Basics - Anfänger-Themen 11
javaBoon86 Array mehrere Dimensionen Java Basics - Anfänger-Themen 10
Buroto Klassen Mehrere .txt Datein verbienden und anschließend auslisten Java Basics - Anfänger-Themen 10
S mehrere TreeSets so speichern, dass man sie miteinander vergleichen kann Java Basics - Anfänger-Themen 1
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
C mehrere JPanel in ein JFrame bringen Java Basics - Anfänger-Themen 9
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
D mehrere Berechnungen in einer Methode Java Basics - Anfänger-Themen 9
U Kann man bei Java gleich mehrere Bedingungen prüfen in der If, aber in einem "Satz"? Java Basics - Anfänger-Themen 1
Kotelettklopfer Mehrere Projekte in einem Git verwalten Java Basics - Anfänger-Themen 10
I JAX-RS Mehrere Parameter in Query Java Basics - Anfänger-Themen 3
M mehrere Rückgabenwerte aus Methode Java Basics - Anfänger-Themen 7
A Input/Output Mehrere Csv-Dateien einlesen Java Basics - Anfänger-Themen 2
R Mehrere Buchstaben aus einem String entfernen Java Basics - Anfänger-Themen 1
TimoN11 Java - Eine oder mehrere Eingaben möglich machen Java Basics - Anfänger-Themen 6
M Mehrere Datenbank zugriffe über tomee.xml regeln? Java Basics - Anfänger-Themen 1
S Mehrere Probleme im Code Java Basics - Anfänger-Themen 7
Ich lerne Java. Methoden Mehrere Methoden mit Punkt Java Basics - Anfänger-Themen 45
M Ausgabe einer Liste welche mehrere Stacks enthält Java Basics - Anfänger-Themen 3
D OOP- Eine Klasse in mehrere Klassen aufteilen Java Basics - Anfänger-Themen 7
F Mehrere Server Sockets in einer Anwendung Java Basics - Anfänger-Themen 9
T DoWhile Schleife über mehrere Mothoden Java Basics - Anfänger-Themen 5
B Methoden Mehrere ähnliche Methoden zusammenfassen Java Basics - Anfänger-Themen 24
E Mehrere Eingabezeilen gleichzeitig einlesen Java Basics - Anfänger-Themen 7
C Mehrere Zufallswerte Java Basics - Anfänger-Themen 4
M Dijkstra Algorithmus in Graphen auf mehrere verschiedene Knoten anwenden lassen Java Basics - Anfänger-Themen 11
R Error, wenn mehrere Clients gleichzeitig die Verbindung beenden Java Basics - Anfänger-Themen 16
F Mehrere Exceptions in einem Catch-Block abfangen Java Basics - Anfänger-Themen 12
O Datei in mehrere kleine Dateien umwandeln Java Basics - Anfänger-Themen 47
Henri Mehrere Ordner umbenennen Java Basics - Anfänger-Themen 11
E Mehrere Arrays addieren mit Übertrag Java Basics - Anfänger-Themen 13
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
J Mehrere paintComponenten in einem Programm Java Basics - Anfänger-Themen 0
F Mehrere Buttons mit einem ActionListener abdecken Java Basics - Anfänger-Themen 24
B Jeweils den Parent bekommen -> mehrere Ebenen Java Basics - Anfänger-Themen 2
javajoshi mehrere Threads: Methoden zentral unterbringen Java Basics - Anfänger-Themen 8
M Erste Schritte Mehrere eingaben in einer Line vergleichen (if equals...) Java Basics - Anfänger-Themen 6
L Mehrere Jars im Unterordner Java Basics - Anfänger-Themen 2
L LibGDX - mehrere Screens Java Basics - Anfänger-Themen 1
J Sudoku mehrere Lösungen Java Basics - Anfänger-Themen 29
F Mehrere Instanzen der Klasse A EINER Instanz der Klasse B übergeben Java Basics - Anfänger-Themen 3
T Mehrere JFrames gleichzeitig öffnen Java Basics - Anfänger-Themen 6
O Erste Schritte Scanner mehrere male benutzen (Konsole) Java Basics - Anfänger-Themen 7
S mehrere If Bedingungen Java Basics - Anfänger-Themen 5
F Mehrere Zeilen zu einer Zeile zusammenfügen und in eine Datei schreiben Java Basics - Anfänger-Themen 1
B Mehrere Zahlen speichern Java Basics - Anfänger-Themen 60
M mehrere extends? Java Basics - Anfänger-Themen 19
N Datei Zeilenweise einlesen, Ausgabe mehrere Arrays Java Basics - Anfänger-Themen 7
C ButtonController löst mehrere Methoden aus Java Basics - Anfänger-Themen 5
D JPanel mehrere Formen zeichnen Java Basics - Anfänger-Themen 5
B Timer mehrere Male ausführen Java Basics - Anfänger-Themen 4
kilopack15 Mehrere Threads in einer Klasse Java Basics - Anfänger-Themen 8
F mehrere eingegebene Zahlen mit Zahlen von 1-9 multiplizieren Java Basics - Anfänger-Themen 18
J Mehrere Eingabefelder programmiert (Zeigt Fehler an) Java Basics - Anfänger-Themen 6
Jinnai4 Mehrere Textfelder überprüfen Java Basics - Anfänger-Themen 16
N Mehrere Forms auf einem Panel Java Basics - Anfänger-Themen 6
Tommy Nightmare Variable auf mehrere Ungleichheiten prüfen Java Basics - Anfänger-Themen 18
D Mehrere Objekte in ein Objekt zusammenfassen Java Basics - Anfänger-Themen 16
D Input/Output Mehrere Befehle nacheinander ausführen Java Basics - Anfänger-Themen 20
K Mehrere Objekte anlegen Java Basics - Anfänger-Themen 23
N Integers aus Textdatei auslesen und mehrere Arrays erstellen Java Basics - Anfänger-Themen 9
S Verständnis - Frage mehrere SQL Statements in While Schleife Java Basics - Anfänger-Themen 0
J MVC Pattern, mehrere Controller/Views/Models Java Basics - Anfänger-Themen 0
J Mehrere IF Anweisungen und dazugehörige ELSE Java Basics - Anfänger-Themen 6
I Klassen Mehrere Java Klassen in einer .java Datei Java Basics - Anfänger-Themen 7
V Mehrere Dateien aus JFileChooser in eine ArrayList speichern Java Basics - Anfänger-Themen 2
A Mehrere Radiobuttons Java Basics - Anfänger-Themen 3
B Klassen Mehrere Objekte mit Schleife erstellen - How? Java Basics - Anfänger-Themen 1
T Mehrere Methoden in der main-Methode verknüpfen und aufeinander anwenden Java Basics - Anfänger-Themen 2
V OOP Aufnahme von Dreiecken in ein/mehrere Objekte Java Basics - Anfänger-Themen 0
Q OOP Mehrere Instanzen auf ein Feld Java Basics - Anfänger-Themen 13
C Klasse auf mehrere Objekte zugreifen lassen Java Basics - Anfänger-Themen 26
G Mehrere If-else-Sätze der Reihe nach durchlaufen lassen Java Basics - Anfänger-Themen 2
K Mehrere String.valueOf() kürzer schreiben / "packen"? Java Basics - Anfänger-Themen 2
F String mehrere male ausgeben? Java Basics - Anfänger-Themen 4
H wie mehrere variablen in einfacher for-schleife? Java Basics - Anfänger-Themen 2
H möglichkeiten für for-schleife? (mehrere ausgangsvariablen?) Java Basics - Anfänger-Themen 9
M PdfBox - mehrere Formularseiten Java Basics - Anfänger-Themen 2
Z Mehrere XML-Dateien zu einer zusammenfügen Java Basics - Anfänger-Themen 3
M GUI- mehrere Komponenten auf Container adden Java Basics - Anfänger-Themen 2
I Erste Schritte Resource Bundle - Alles in einem File oder mehrere? => Faktor Performance Java Basics - Anfänger-Themen 2
F Methoden split() - Mehrere Zeichen Java Basics - Anfänger-Themen 5
F Erste Schritte Mehrere nextInt() Eingaben nebeneinander ausgeben Java Basics - Anfänger-Themen 12
A mehrere Panels in eigenen Klasssen in einem Frame Java Basics - Anfänger-Themen 16
A Mehrere 100.000 Elemente verlgeichen Java Basics - Anfänger-Themen 8
T Compiler-Fehler Mit Array und "for" mehrere ImageIcon erstellen Java Basics - Anfänger-Themen 7
N Mehrere berechnungen auf einem Button legen? Java Basics - Anfänger-Themen 19
F Swing Applet: mehrere Komponenten hinzufügen Java Basics - Anfänger-Themen 1
F Speicherlast mehrere GB durch kleine png files? Java Basics - Anfänger-Themen 1
C Mehrere Tasten beim KeyListener gleichzeitig lesen Java Basics - Anfänger-Themen 2
M Mehrere Variabeln zusammenfassen Java Basics - Anfänger-Themen 4
M Erste Schritte mehrere Objekte aus einer Klasse Java Basics - Anfänger-Themen 4
L String extrahieren mit Regular Expression über mehrere Zeilen hinweg Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben