Tengo tres clases, un usuario abstracto y dos específicos: NormalUser que contiene una ArrayList de uno o más objetos de dirección que pueden ser diferentes (doméstico, internacional, personalizado, etc.) y luego el Clase de administrador que tiene un método que devuelve verdadero. Ambos contienen más métodos que no están relacionados entre sí.Herencia de Java y evitar el uso constante de instanceof
abstract class User{
public User(String username, String pw){
...
}
public class NormalUser extends User{
...
private ArrayList<Address> addresses;
...
public void addAdress(ArrayList<Address> address){
addresses.addAll(address);
}
public class Admin extends User{
...
public boolean getIsAdmin(){
return true;
}
}
Ahora en otro ramo, si hago 4 objetos de usuario así por ejemplo:
ArrayList<User> users;
users.add(new NormalUser("1", "pw");
users.add(new NormalUser("2", "pw");
users.add(new NormalUser("3", "pw");
users.add(new NormalUser("4", "pw");
users.add(new Admin("5", "pw"));
users.add(new NormalUser("6", "pw");
Y digo que quiero utilizar el método addAddress en NormalUser, entonces tengo que abatido el usuario specfic en usuarios a NormalUser, antes de que pueda utilizar el método addAddress en NormalUser así:
if (user instanceof NormalUser){
NormalUser normal = (NormalUser) user;
normal.addAddress(...)
}
la razón por la que me gustaría tanto NormalUser y de administración para ser un usuario es para que pueda procesarlos juntos al iniciar sesión.
Pensé en agregar addEmail a la clase User y luego anularla en la clase NormalUser, pero tendría que hacer eso para cada método en la clase NormalUser, además Admin lo heredaría de la Usuario también, cuando no necesita esa funcionalidad.
Pregunta 1: ¿Hay una manera mejor de hacer esto que he escuchado usando instanceof es algo malo? y tendría que usar instanceof cada vez que utilizo un método que es específico de la clase NormalUser.
Quesiton 2: es una ArrayList de objeto ¿Direcciones de la mejor manera de vincular el Usuario Regular a direcciones específicas/(Objetos)?
No hay ninguna base de datos involucrada en este momento.
Así, por ejemplo, un usuario tiene 2 direcciones uno interno y otro internacional, y el usuario B solo tiene una dirección doméstica, el usuario C tiene una interna y una dirección personalizada etc.
Gracias.
PS. He buscado las publicaciones anteriores extensamente pero no he encontrado una solución. En ambos libros de Java, ambos muestran ejemplos de uso de instanceof, pero no se menciona que sea una mala práctica.
En cuanto a este caso específico, me temo que no puedo decir cuál es mejor, pero no, 'instanceof' no es, por definición, algo malo. No debes abusar de él cuando el polimorfismo es más apropiado. –
Relacionado con el 'instanceof': debe reconsiderar su diseño para que nunca llame a' addAddress' en un 'Usuario' básico. Solo debe llamar a dicho método cuando se encuentre en un bloque de código diseñado específicamente para 'NormalUser'. – toto2
¿hay alguna buena razón para que los administradores no tengan direcciones? – soulcheck