Digamos que tengo dos constructores de mi clase:Java - ¿Cómo lidiar con el borrado de tipos en los constructores?
public User (List<Source1> source){
...
}
public User (List<Source2> source) {
...
}
Digamos que estos dos constructores proporcionan la misma información sobre un usuario y son igualmente formas válidas para la construcción de un usuario para diferentes casos de uso.
En Java, no puede hacer esto debido a la borradura de tipo: Java no aceptará dos constructores que tengan como parámetros la lista <? >.
Entonces, ¿cuál es la forma de evitar esto? ¿Cuál es una solución que no es exagerada sino que respeta el OO básico? Parece incorrecto tener que construir un método de fábrica u otra interfaz en torno a esto solo porque Java no tiene un sólido soporte de genéricos.
Estas son las posibilidades que se me ocurren:
1) aceptar un List<?>
como un parámetro para el constructor y analizará en el constructor, que tipo de lógica que necesita, o lanzar una excepción si no es ninguna de las tipos aceptados
2) Cree una clase que acepte cualquiera de las listas, construya el objeto de usuario apropiado y lo devuelva.
3) Cree envolturas alrededor de List<Source1>
y List<Source2>
que se pueden pasar al constructor del usuario.
4) Subclase este tipo con dos clases, donde toda la funcionalidad se hereda excepto el constructor. El constructor de uno acepta Source1, el otro acepta Source2.
5) Envuelva este tipo con un constructor donde hay dos métodos diferentes de compilación para las dos fuentes de datos diferentes para la creación de instancias.
Mis preguntas son las siguientes:
1) ¿Es la necesidad de hacer esto con un defecto de Java o una decisión de diseño intencional? ¿Cuál es la intuición?
2) ¿Qué solución es más sólida en términos de mantener un buen código sin introducir una complejidad innecesaria? ¿Por qué?
Esta pregunta es similar: Designing constructors around type erasure in Java pero no entra en detalles, simplemente sugiere varias soluciones alternativas.
por qué hacer eso, en primer lugar, ¿por qué no escriba parametrizar toda la clase? o simplemente crea la fábrica que es un buen patrón en este caso de todos modos. –
Se podría escribir una función y luego probar los tipos de las listas al comienzo de la función y escriba fundido en función del tipo ... o usar un lenguaje mejor – NKamrath
... o puede recurrir a reifiable tipos, como las matrices . –