【问题标题】:How can I use same methods in different classes type ArrayList?如何在不同的类类型 ArrayList 中使用相同的方法?
【发布时间】:2016-12-23 14:02:09
【问题描述】:

我正在做一个应该存储在两个不同文本文件中的项目。假设我有 2 个类 Person 和 Activity,每个类只有以下共同属性:id 和 isActive。但也有很多不常见的。

我还有 2 个类 ArrayList 类型:

public class RegistryPerson extends ArrayList<Person> {
     public void add(Person obj){
              ....
     }
     public boolean isDuplicate(Person obj){
         for(Person p: this){
             if(obj.equals(p)){ 
                 return true;
             }
         }
         return false;
     } 
     public Person search(int id){
              ....
     }
     public void readFile(){
         otherClass.readFile(String txtfilePerson);
     } 
     public void activate(Person obj){
              obj.setActivate;
     }
     //more methods
}

.

public class RegistryActivity extends ArrayList<Activity> {
     public void add(Activity obj){
              ....
     }
     public boolean isDuplicate(Activity obj){
         for(Activity p: this){
             if(obj.equals(p)){ 
                 return true;
             }
         }
         return false;
     } 
     public Activity search(int id){
              ....
     }
     public void readFile(){
         otherClass.readFile(String txtfileActivity);
     } 
     public void activate(Activity obj){
              obj.setActivate;
     }
     //more methods
}

两个类的方法相同

如您所见,ArrayList RegitryPerson 和 RegistryActivigy 两个类类型具有相同的方法,但有些使用了不同类型的对象。

我只是不想在不同的类中使用几乎相同的代码。我可以使用接口或抽象类吗?最重要的是,如何实现?还是我把一切都复杂化了?

谢谢。

【问题讨论】:

  • 强烈建议您不要扩展 ArrayList。只需将 List 作为类的实例变量即可。
  • @puhlen 谢谢.. 你能提供更多信息吗?

标签: java class arraylist refactoring


【解决方案1】:

您可以在这里遵循Program to an interface, not implementations的设计原则。

创建一个interface,比如Entity,它将由PersonActivity 实现

Entity.java

public interface Entity {
    public Boolean equals(Entity e);
    //other common methods
}

这个接口将由PersonActivity 实现

Person.java

public class Person implements Entity {
    ...
    @Override
    public boolean equals(Entity e) {
        ...
    }
    ...
}

Activity.java

public class Activity implements Entity {
    ...
    @Override
    public boolean equals(Entity e) {
        ...
    }
    ...
}

现在创建一个父类注册表

Registry.java

public class Registry extends ArrayList<Entity> {
     public void add(Entity obj){
              ....
     }
     public boolean isDuplicate(Entity obj){
         for(Entity p: this){
             if(obj.equals(p)){ 
                 return true;
             }
         }
         return false;
     } 
     public Entity search(int id){
              ....
     }
     public void readFile(){
         otherClass.readFile(String txtfilePerson);
     } 
     public void activate(Entity obj){
              obj.setActivate;
     }
     //more methods
}

现在您可以将此 Registry 类扩展到您的两个实现,即 RegistryPersonRegistryActivity

RegistryPerson.java

public class RegistryPerson extends Registry {
    ..
}

RegistryActivity.java

public class RegistryActivity extends Registry {
    ..
}

P.S.:上面列出的所有类都包含更常用的方法。这只是给你这个设计原则的基本介绍。

【讨论】:

  • 谢谢@rD。这正是我想要的,当然你可以改进很多东西,但要循序渐进。
【解决方案2】:

我和 rD 有同样的想法,但使用泛型来创建注册表。我还在课堂内移动了列表。从文件读取和添加注册表的方法可以由其他类处理。我尝试不惜一切代价避免继承和抽象类。接口是泛型,非常强大。

interface IdObject {
    int getId();
}

class Registry<T extends IdObject> {
    private List<T> list = new ArrayList<T>();

    public void add(T obj){
        list.add(obj);
    }

    public boolean isDuplicate(T obj){
        for(T t: list){
            if(obj.equals(t)){
                return true;
            }
        }
        return false;
    }
    public T search(int id){
        for(T t: list){
            if(t.getId() == id)){
                return t;
            }
        }
        return null;
    }
}

class Example {
    Registery<Person> personRegistery = new Registry<>();
    Registery<Activity> activityRegistery = new Registry<>();
}

【讨论】:

  • 加 1 表示优先组合而不是继承,而不是使注册表成为 arraylist 的子类!
  • 同意@GhostCat - 组合而不是继承是 OP 出错的地方。
猜你喜欢
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多