Java 如何在不同的类类型ArrayList中使用相同的方法?

Java 如何在不同的类类型ArrayList中使用相同的方法?,java,class,arraylist,refactoring,Java,Class,Arraylist,Refactoring,我正在做一个项目,它应该存储在两个不同的文本文件中。假设我有两个类Person和Activity,每个类只有以下共同属性:id和isActive。但也有许多是不常见的 我还有两个类ArrayList类型: public class RegistryPerson extends ArrayList<Person> { public void add(Person obj){ .... } public boolean isDup

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

我还有两个类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
}
公共类RegistryPerson扩展了ArrayList{
公共无效添加(人员对象){
....
}
公共布尔值重复(个人对象){
对于(人员p:本){
如果(obj.等于(p)){
返回true;
}
}
返回false;
} 
公众人物搜索(int id){
....
}
公共void readFile(){
readFile(字符串txtfilePerson);
} 
公共无效激活(人员obj){
obj.setActivate;
}
//更多方法
}

公共类注册表活动扩展了ArrayList{
公共作废添加(活动obj){
....
}
公共布尔值重复(活动对象){
对于(活动p:本){
如果(obj.等于(p)){
返回true;
}
}
返回false;
} 
公共活动搜索(int id){
....
}
公共void readFile(){
readFile(字符串txtfileActivity);
} 
公共作废激活(活动obj){
obj.setActivate;
}
//更多方法
}
两个类都有相同的方法

正如您所看到的,类型为ArrayList RegityPerson和RegistryActivity的两个类都有相同的方法,但有些类使用了不同类型的对象

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

谢谢。

您可以在这里遵循设计原则

创建一个
界面
比如说
实体
,由
人员
活动

Entity.java

public interface Entity {
    public Boolean equals(Entity e);
    //other common methods
}
public class Person implements Entity {
    ...
    @Override
    public boolean equals(Entity e) {
        ...
    }
    ...
}
public class Activity implements Entity {
    ...
    @Override
    public boolean equals(Entity e) {
        ...
    }
    ...
}
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
}
public class RegistryPerson extends Registry {
    ..
}
public class RegistryActivity extends Registry {
    ..
}
此接口将由
人员
活动

Person.java

public interface Entity {
    public Boolean equals(Entity e);
    //other common methods
}
public class Person implements Entity {
    ...
    @Override
    public boolean equals(Entity e) {
        ...
    }
    ...
}
public class Activity implements Entity {
    ...
    @Override
    public boolean equals(Entity e) {
        ...
    }
    ...
}
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
}
public class RegistryPerson extends Registry {
    ..
}
public class RegistryActivity extends Registry {
    ..
}
Activity.java

public interface Entity {
    public Boolean equals(Entity e);
    //other common methods
}
public class Person implements Entity {
    ...
    @Override
    public boolean equals(Entity e) {
        ...
    }
    ...
}
public class Activity implements Entity {
    ...
    @Override
    public boolean equals(Entity e) {
        ...
    }
    ...
}
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
}
public class RegistryPerson extends Registry {
    ..
}
public class RegistryActivity extends Registry {
    ..
}
现在创建一个父类注册表

Registry.java

public interface Entity {
    public Boolean equals(Entity e);
    //other common methods
}
public class Person implements Entity {
    ...
    @Override
    public boolean equals(Entity e) {
        ...
    }
    ...
}
public class Activity implements Entity {
    ...
    @Override
    public boolean equals(Entity e) {
        ...
    }
    ...
}
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
}
public class RegistryPerson extends Registry {
    ..
}
public class RegistryActivity extends Registry {
    ..
}
RegistryActivity.java

public interface Entity {
    public Boolean equals(Entity e);
    //other common methods
}
public class Person implements Entity {
    ...
    @Override
    public boolean equals(Entity e) {
        ...
    }
    ...
}
public class Activity implements Entity {
    ...
    @Override
    public boolean equals(Entity e) {
        ...
    }
    ...
}
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
}
public class RegistryPerson extends Registry {
    ..
}
public class RegistryActivity extends Registry {
    ..
}

注:上面列出的所有类中,许多都包含更常见的方法。这只是给你这个设计原则的基本介绍。

我的想法与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<>();
}
接口IdObject{
int getId();
}
类注册表{
私有列表=新的ArrayList();
公共无效添加(T obj){
列表。添加(obj);
}
公共布尔isDuplicate(T obj){
对于(T:列表){
如果(对象等于(t)){
返回true;
}
}
返回false;
}
公共T搜索(int id){
对于(T:列表){
if(t.getId()==id)){
返回t;
}
}
返回null;
}
}
课例{
Registry personRegistry=新注册表();
Registry ActivityRegistry=新注册表();
}

plus 1,用于优先组合而不是继承,并且不使注册表成为arraylist的子类!同意@GhostCat-组合而非继承是OP出错的地方。强烈建议不要扩展ArrayList。只要有一个列表作为类的实例变量。@puhlen谢谢。。你能提供更多的信息吗?谢谢@rD。这正是我想要的,当然你可以改进很多东西,但要一步一步来。