Es wird kein Default Konstruktur erstellt (java)?

Es geht dabei um folgendes Entwurfsmodell-Brücke:
Der Code ist von diesem tutorial http://www.journaldev.com/1491/bridge-design-pattern-java
da dieser aber den code auf Bildern hat, füge ich den code hier ein, um ihn schneller zu kopieren.
Problem ist folgendes. Java-Dokumentation sagt: ist kein Konstrukter angegeben wird der default genommen. lösche ich aber bei shape.java, Pentagon.java, Triangel.java die konstruktoren raus. bekomme ich Fehlermeldungen. Kann mir jemand erklären, warum hier nicht das aus der Java Dokumentation gilt?

BridgePattern.java

public class BridgePattern {

public static void main(String[] args) {
	Shape tri = new Triangle(new RedColor());
	tri.applyColor();
	
	Shape pent = new Pentagon(new GreenColor());
	pent.applyColor();
}

}

Color.java

public interface Color {

public void applyColor();
}

GreenColor.java

public class GreenColor implements Color{

public void applyColor(){
	System.out.println("green.");
}
}

Pentagon.java

public class Pentagon extends Shape{

public Pentagon(Color c) {
	super(c);
}

@Override
public void applyColor() {
	System.out.print("Pentagon filled with color ");
	color.applyColor();
} 

}

RedColor.java

public class RedColor implements Color{

public void applyColor(){
	System.out.println("red.");
}
}

Shape.java

public abstract class Shape {
	//Composition - implementor
	protected Color color;

//constructor with implementor as input argument
public Shape(Color c){
	this.color=c;
}

abstract public void applyColor();
}

Triangle.java

public class Triangle extends Shape{

public Triangle(Color c) {
	super(c);
}

@Override
public void applyColor() {
	System.out.print("Triangle filled with color ");
	color.applyColor();
} 

}

Der default-Konstruktor ist immer ohne Argumente. Alle anderen müssen selber implementiert werden.

Ja das ist mir bekannt. Aber warum werden diese Argumente überhaupt gebraucht?Ich sehe nichts sinnvolles was dabei übertragen/festgelegt wird 0,o

Dann ist mir deine Ursprungsfrage nicht ganz klar. Wenn du keinen Konstruktor mit Parametern mehr hast kannst du auch nur noch den Default Konstruktor ohne Parameter verwenden. Das ist aber nicht der Fall:

public static void main(String[] args) {
Shape tri = new Triangle(new RedColor());
tri.applyColor();

Shape pent = new Pentagon(new GreenColor());
pent.applyColor();

}

Wozu man die Attribute benötigt? In diesem Fall wohl um in applyColor() die im Konstruktor verwendete Farbe auszugeben:

z.B. in Pentagon:

@Override
public void applyColor() {
    System.out.print("Pentagon filled with color ");
    color.applyColor();
} 

Ohne color vorher zu initialisieren würde das ein NullPointerException werfen. Ob es sinnvoll ist die Color nach Stdout auszugeben musst du entscheiden, bei deinem Link handelt es sich ja lediglich um ein Beispiel zur Erklärung des Pattern. In einem „richtigen“ Programm dürfte diese Farbe in Verbindung mit Shapes ja durchaus eine sinnvolle Aufgabe besitzten.

Gruß
Heavy

1 Like

ah Danke! Du hast mir die Augen geöffnet.
Ich war auch bisschen verwirrt warum ein „leere“ parameter übergeben werden (Color c)
jetzt wird es schon klarer.