Ho tre classi, un utente astratto e due specifici: NormalUser che contiene un ArrayList di uno o più oggetti Address che possono essere diversi (domestico, internazionale, personalizzato ecc.) E quindi il Classe di amministrazione che ha un metodo che restituisce true. Entrambi contengono più metodi che non sono correlati tra loro.Ereditarietà Java ed evitando l'uso costante di 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;
}
}
Ora, in un'altra classe se faccio 4 oggetti utente in questo modo, per esempio:
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");
e dire che voglio utilizzare il metodo addAddress in NormalUser, allora devo downcast l'utente specfic in agli utenti di NormalUser, prima di poter utilizzare il metodo addAddress in NormalUser come questo:
if (user instanceof NormalUser){
NormalUser normal = (NormalUser) user;
normal.addAddress(...)
}
il motivo per cui mi piacerebbe sia NormalUser e Admin essere un utente è così che io possa elaborare insieme al momento del login.
Ho pensato di aggiungere l'addEmail alla classe User e quindi sovrascriverlo nella classe NormalUser, ma dovrei farlo per ogni metodo nella classe NormalUser, più Admin lo erediterebbe dal Anche l'utente, quando non ha bisogno di quella funzionalità.
Domanda 1: C'è un modo migliore per farlo perché ho sentito che usare instanceof è una cosa negativa? e dovrei usare instanceof ogni volta che utilizzo un metodo specifico per la classe NormalUser.
Quesiton 2: È un elenco array di indirizzi indirizzi il modo migliore per collegare il RegularUser a specifici indirizzi/(oggetti)?
Al momento non sono presenti database.
Così, per esempio all'utente una ha 2 indirizzi uno nazionale e uno internazionale, e l'utente B ha solo un indirizzo interno, l'utente c ha una domestica e un indirizzo personalizzato, ecc
Grazie.
PS. Ho cercato estensivamente i post precedenti ma non ho trovato una soluzione. In entrambi i miei libri Java entrambi mostrano esempi di utilizzo di instanceof ma nessuna menzione del fatto che sia una cattiva pratica.
In questo caso specifico, temo di non poter dire veramente quale sia il migliore, ma no, 'instanceof' non è per definizione una cosa negativa. Non dovresti esagerare quando il polimorfismo è più appropriato. –
In relazione a 'instanceof': dovresti riconsiderare il tuo progetto in modo tale da non chiamare mai' addAddress' su un utente di base'. Dovresti chiamare questo metodo solo quando ti trovi in un blocco di codice progettato specificamente per 'NormalUser'. – toto2
c'è qualche buona ragione per gli amministratori di non avere indirizzi? – soulcheck