C'est naturel si vous réfléchissez calmement, mais j'y ai pensé un instant, donc comme mémo ...
Il existe une classe Square
qui a des longueurs verticales et horizontales dans les champs, en omettant Getetter
/ Setter
.
Square.java
public class Square {
private int width;
private int height;
}
Si vous permettez de définir la valeur à l'aide de Builder
et de créer une classe qui renvoie la zone à la fin, ce sera comme suit.
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();
}
}
}
Ensuite, vous pouvez trouver la zone comme celle-ci
Main.java
public class Main {
public static void main(String[] args) {
SquareBuilder.Builder squareBuilder = new SquareBuilder.Builder();
System.out.println("La zone est:" + squareBuilder.width(5).height(10).build());
}
}
Il n'y a pas de problème particulier pour l'instant. : léger_sourire:
Ensuite, créez une classe Cube
qui hérite de Square
. (Omettez Getter
/ Setter
.)
Cube.java
public class Cube extends Square {
private int depth;
}
Mis à part si la hauteur était `` profondeur '' ...: baisers:
Il hérite également de 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();
}
}
}
Ensuite, vous pouvez trouver le volume comme celui-ci.
Main.java
public class Main {
public static void main(String[] args) {
CubeBuilder.Builder cubeBuilder = new CubeBuilder.Builder();
System.out.println("Le volume est:" + cubeBuilder.depth(2).width(5).height(10).build());
}
}
Ce code passe par la compilation et nécessite du volume, mais c'est en fait un problème.
Vous devez d'abord appeler depth ()
pour trouver le volume. : inquiet:
La raison est que les valeurs de retour de «width ()» et «height ()» sont de type «SquareBuilder.Builder», vous ne pouvez donc pas appeler «depth ()», qui est défini uniquement dans «CubeBuilder.Builder». ..
Nous utiliserons ici des génériques.
Référence: Sous-classification d'une classe Java Builder
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();
}
}
}
En conséquence, le type de retour de width ()
et height ()
sera une classe qui hérite deSquareBuilder.Builder
au lieu de SquareBuilder.Builder
, il est donc nécessaire d'appeler depth ()
en premier. perdre.
Main.java
public class Main {
public static void main(String[] args) {
SquareBuilder.Builder squareBuilder = new SquareBuilder.Builder();
System.out.println("La zone est:" + squareBuilder.width(5).height(10).build());
CubeBuilder.Builder cubeBuilder = new CubeBuilder.Builder();
System.out.println("Le volume est:" + cubeBuilder.width(5).height(10).depth(2).build());
}
}
Cependant, je me sens un peu mal à l'aise car il y a un avertissement. : masque:
C'est un programme qui met des valeurs dans POJO qui a beaucoup de champs et qui les affiche au format JSON, il est donc devenu difficile de mettre les valeurs dans Setter
une par une, et j'étais accro à l'utilisation de Builder
.
Dans cet exemple, la zone ne peut pas être calculée, mais Warning peut être éliminé en faisant de SquareBuilder
une classe abstraite.
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();
}
}
}