Наследование Java и отказ от постоянного использования instanceof

У меня есть три класса: абстрактный пользователь и два конкретных: NormalUser, который содержит ArrayList из одного или нескольких объектов Address, которые могут быть разными (внутренние, международные, специальные и т. Д.), А затем класс Admin, у которого есть метод, который возвращает правда . Оба они содержат больше методов, не связанных друг с другом.

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;
  }
}

Теперь в другом классе, если я создаю 4 пользовательских объекта, например, таких:

    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");

И скажем, я хочу использовать метод addAddress в NormalUser, тогда я должен понижать значение определенного пользователя в users до NormalUser, прежде чем я смогу использовать метод addAddress в NormalUser выглядит следующим образом:

     if (user instanceof NormalUser){
        NormalUser normal = (NormalUser) user;
        normal.addAddress(...)
        }

Причина, по которой я хотел бы, чтобы и NormalUser, и Admin были пользователем, состоит в том, чтобы я мог обрабатывать их вместе при входе в систему.

Я подумал о добавлении addEmail в класс User и затем переопределив его в классе NormalUser, но мне пришлось бы сделать это для каждого метода в классе NormalUser, плюс администратор также унаследовал бы его от пользователя, когда ему не нужны эти функции.

Вопрос 1 : Есть ли лучший способ сделать это, как я слышал, использование instanceof - это плохо? и мне пришлось бы использовать instanceof каждый раз, когда я использую метод, специфичный для класса NormalUser.

Quesiton 2 : Является ли ArrayList адресов объекта лучшим способом связать RegularUser с конкретными адресами / (объектами)?

В настоящее время база данных не задействована.

Так, например, у пользователя a есть 2 адреса, один внутренний и один международный, а у пользователя b только внутренний адрес, у пользователя c есть внутренний и собственный адрес и т. Д.

Спасибо.

PS.Я тщательно просмотрел предыдущие сообщения, но не нашел решения. В обеих моих книгах по Java показаны примеры использования instanceof, но не упоминается, что это плохая практика.

5
задан Brah 4 December 2011 в 16:47
поделиться