繁体   English   中英

Java继承并避免不断使用instanceof

[英]Java Inheritance and avoiding constant use of instanceof

我有三个类,一个抽象用户和两个特定的:NormalUser,它包含一个或多个Address对象的ArrayList,可以是不同的(国内,国际,自定义等),然后是Admin类,它有一个返回true的方法。 它们都包含更多彼此无关的方法。

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

并说我想在NormalUser中使用addAddress方法,然后我必须将用户中的specfic用户向下转换为NormalUser,然后才能在NormalUser中使用addAddress方法,如下所示:

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

我希望NormalUser和Admin都成为用户的原因是我可以在登录时一起处理它们。

我想到将addEmail添加到User类,然后在NormalUser类中重写它,但是我必须为NormalUser类中的每个方法执行此操作,而且Admin也会从User继承它,当它不需要时功能。

问题1 :有没有更好的方法来实现这一点,因为我听说使用instanceof是一件坏事? 每次我使用特定于NormalUser类的方法时,我都必须使用instanceof。

问题2 :对象的ArrayList是否是将RegularUser链接到特定地址/(对象)的最佳方法?

目前没有涉及数据库。

例如,用户a有2个地址,一个国内,一个国际,用户b只有国内地址,用户c有国内和自定义地址等。

谢谢。

PS。 我已经广泛搜索过以前的帖子,但还没有找到解决方案。 在我的两本Java书中,他们都展示了使用instanceof的例子,但没有提到它是一种不好的做法。

您可以使用访问者模式 - 有点笨拙且稍微不可读,但可能是您问题的最佳解决方案。

实际上,将addEmail推送到基类的解决方案并不是那么糟糕。 只需在基本User提供一个空实现,并在RegularUser覆盖。 如果你想检查是否给User实例支持添加电子邮件,提供像另一个方法supportsAddEmail返回false默认和true覆盖时addEmail

我认为最简单的解决方案是创建一个包含NormalUser列表和Admin列表的UserList类。 UserList类的实例将替换原始列表。 UserList类可以提供一些方法,例如:

  • 用户getUser(索引i)//使用两个列表实现

  • 用户removeUser(索引i)//使用两个列表实现

  • NormalUser getNormalUser(index i)//使用普通用户列表实现
  • NormalUser removeNormalUser(index i)//使用普通用户列表实现
  • Admin getAdmin(index i)//使用admin用户列表实现
  • Admin removeAdmin(index i)//使用admin用户列表实现
  • ....

用于处理适当列表的所有代码都将封装在UserList类中。 您可以使用同时使用两个列表或仅使用一个列表的方法,具体取决于您需要对用户执行的操作。 与UserList交互的类不知道UserList中是否只有一个或两个列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM