Suponiendo que tengo una superclase que tiene 3 parámetros en su constructor y estoy heredando esta clase que también tiene un constructor con 3 parámetros, y quiero llamar al constructor de la superclase pero antes quiero hacer algo de lógica en la subclase primero , Puedo llamar a un método estático que recibe esos 3 parámetros pero tengo que devolver solo uno, así que esta es la solución que se me ocurrió
public class someClass extends SuperClass {
public someClass(int a,int b,int c) {
super(func(a,b,c),b,c);
}
public static int func(int a,int b,int c){
//usage a b c
return a;
}
}
Parece un poco feo y me preguntaba si hay una mejor solución para usar los parámetros yo mismo y luego llamar súper regularmente. Tenga en cuenta que no puedo cambiar la clase Super o los usos de las subclases y, por lo tanto, el patrón de diseño de fábrica
3 respuestas
Para sacar la lógica de su constructor, puede crear fácilmente un método de fábrica en su subclase:
public class SomeClass extends SuperClass {
private SomeClass(int a, int b, int c) {
super(a, b ,c);
}
public static SomeClass create(int a, int b, int c){
// calculate a for constructor
return new SomeClass(a, b, c);
}
}
Luego puede crear instancias de la siguiente manera:
SomeClass someClass = SomeClass.create(1, 2, 3);
En Java, no puede ejecutar otra instrucción antes de la llamada a super
. El truco que mencionó funciona, pero no puede refactorizar su código para que llame a func
en una declaración antes de la llamada a super
.
En mi experiencia, problemas como este a menudo sugieren algún problema de diseño. Quizás pueda resolver el problema subyacente al repensar las responsabilidades de las dos clases involucradas.
También puedes usar el patrón de construcción
public class SomeClass extends SuperClass {
public static class Builder {
private int a, b, c;
public Builder withA(int a) {
this.a = a;
return this;
}
public Builder withB(int b) { ... }
public Builder withC(int c) { ... }
public SomeClass build() {
// logic goes here
return new SomeClass(...)
}
}
// hide this from public use, use Builder instead
protected SomeClass(int a, int b, int, c) {
super(a, b, c);
}
}
SomeClass someClass = new SomeClass.Builder().
withA(1).
withB(2).
withC(3).
build();
Nuevas preguntas
java
Java es un lenguaje de programación de alto nivel. Utilice esta etiqueta cuando tenga problemas para usar o comprender el idioma en sí. Esta etiqueta rara vez se usa sola y se usa con mayor frecuencia junto con [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] y [maven].