Es ist natürlich, wenn Sie ruhig denken, aber ich habe einen Moment darüber nachgedacht, also als Memo ...
Es gibt eine "Quadrat" -Klasse mit vertikalen und horizontalen Längen in den Feldern, wobei "Getetter" / "Setter" weggelassen wird.
Square.java
public class Square {
private int width;
private int height;
}
Wenn Sie es ermöglichen, den Wert mit "Builder" festzulegen und eine Klasse zu erstellen, die den Bereich am Ende zurückgibt, ist dies wie folgt.
SquareBuilder.java
public class SquareBuilder {
public static class Builder {
Square square = new Square();
public Builder() {}
public Builder width(int width) {
square.setWidth(width);
return this;
}
public Builder height(int height) {
square.setHeight(height);
return this;
}
public int build() {
return square.getWidth() * square.getHeight();
}
}
}
Dann können Sie den Bereich wie diesen finden
Main.java
public class Main {
public static void main(String[] args) {
SquareBuilder.Builder squareBuilder = new SquareBuilder.Builder();
System.out.println("Bereich ist:" + squareBuilder.width(5).height(10).build());
}
}
Bisher gibt es kein besonderes Problem. : mild_smile:
Erstellen Sie als Nächstes eine "Cube" -Klasse, die von "Square" erbt. (Lassen Sie Getter
/ Setter
weg.)
Cube.java
public class Cube extends Square {
private int depth;
}
Abgesehen davon, ob die Höhe "Tiefe" war ...: Küssen: Es erbt auch "Builder"
CubeBuilder.java
public class CubeBuilder extends SquareBuilder {
public static class Builder extends SquareBuilder.Builder {
private Cube cube = new Cube();
public Builder() {}
public Builder depth(int depth) {
cube.setDepth(depth);
return this;
}
@Override
public int build() {
return super.build() * cube.getDepth();
}
}
}
Dann können Sie die Lautstärke wie folgt finden.
Main.java
public class Main {
public static void main(String[] args) {
CubeBuilder.Builder cubeBuilder = new CubeBuilder.Builder();
System.out.println("Lautstärke ist:" + cubeBuilder.depth(2).width(5).height(10).build());
}
}
Dieser Code durchläuft die Kompilierung und erfordert Volumen, ist aber tatsächlich ein Problem. Sie müssen zuerst "depth ()" aufrufen, um das Volume zu finden. : besorgt:
Der Grund dafür ist, dass die Rückgabewerte von "width ()" und "height ()" vom Typ "SquareBuilder.Builder" sind. Sie können also nicht "depth ()" aufrufen, das nur in "CubeBuilder.Builder" definiert ist. ..
Wir werden hier Generika verwenden.
Referenz: Unterklasse einer Java Builder-Klasse
SquareBuilder.java
public class SquareBuilder {
public static class Builder<T extends Builder<T>> {
Square square = new Square();
public Builder() {}
public T width(int width) {
square.setWidth(width);
return (T) this;
}
public T height(int height) {
square.setHeight(height);
return (T) this;
}
public int build() {
return square.getWidth() * square.getHeight();
}
}
}
CubeBuilder.java
public class CubeBuilder extends SquareBuilder {
public static class Builder extends SquareBuilder.Builder<Builder> {
private Cube cube = new Cube();
public Builder() {}
public Builder depth(int depth) {
cube.setDepth(depth);
return this;
}
@Override
public int build() {
return super.build() * cube.getDepth();
}
}
}
Infolgedessen ist der Rückgabetyp von "width ()" und "height ()" nicht "SquareBuilder.Builder", sondern eine Klasse, die "SquareBuilder.Builder" erbt. Daher muss zuerst "depth ()" aufgerufen werden. verlieren.
Main.java
public class Main {
public static void main(String[] args) {
SquareBuilder.Builder squareBuilder = new SquareBuilder.Builder();
System.out.println("Bereich ist:" + squareBuilder.width(5).height(10).build());
CubeBuilder.Builder cubeBuilder = new CubeBuilder.Builder();
System.out.println("Lautstärke ist:" + cubeBuilder.width(5).height(10).depth(2).build());
}
}
Ich fühle mich jedoch etwas unwohl, weil es eine Warnung gibt. : mask:
Es ist ein Programm, das Werte in POJO einfügt, das viele Felder enthält und diese im JSON-Format ausgibt. Daher wurde es schwierig, Werte einzeln in "Setter" einzufügen, und ich war süchtig nach "Builder".
In diesem Beispiel kann die Fläche nicht berechnet werden, aber Sie können die Warnung beseitigen, indem Sie "SquareBuilder" zu einer abstrakten Klasse machen.
SquareBuilder.java
public class SquareBuilder {
public abstract static class Builder<T extends Builder<T>> {
Square square = new Square();
public Builder() {}
public abstract T getThis();
public T width(int width) {
square.setWidth(width);
return getThis();
}
public T height(int height) {
square.setHeight(height);
return getThis();
}
public int build() {
return square.getWidth() * square.getHeight();
}
}
}
CubeBuilder.java
public class CubeBuilder extends SquareBuilder {
public static class Builder extends SquareBuilder.Builder<Builder> {
private Cube cube = new Cube();
public Builder() {}
@Override
public Builder getThis() {
return this;
}
public Builder depth(int depth) {
cube.setDepth(depth);
return this;
}
@Override
public int build() {
return super.build() * cube.getDepth();
}
}
}