Java:方法的重复

时间:2014-10-16 21:05:39

标签: java class oop

这感觉就像这样一个基本问题,但这对我来说是全新的:

我有一个Person和Room类,它们都有Item对象列表。

public class Person{
  private ArrayList<Item> items;

  public Person() {
    items = new ArrayList<>();
  }

  public void addItem(){
  ...
  }

  public void removeItem(){
  ...
  }

}    

public class Room {

  private ArrayList<Item> items;

  public Room () {
    items = new ArrayList<>();
  }

  public void addItem(){
  ...
  }

  public void removeItem(){
  ...
  }

}

项目方法,例如addItem()在Room类和Person类中都是重复的,这不是很好。我想要制作一个单独的库存类,其中包含项目和项目方法的列表,然后每个房间和人员都有一个库存。

但是如果我使用私人库存字段,那么我将无法从人员或房间调用Item方法。

这里停止复制的最佳方法是什么?提前谢谢!

3 个答案:

答案 0 :(得分:7)

你是对的。制作单独的库存类将是一个很好的OOP设计。

我很高兴您没有说要为RoomPerson创建一个父类,因为虽然这样可以避免重复,但房间和人员并不相关,所以他们不应该真的在面向对象的意义上也是相关的。

您可以使用委派将添加/删除项目委派给Inventory字段。

public class Room {

    private Inventory inventory = new Inventory();

    public void addItem(Item item) {
        inventory.addItem(item);
    }

    public void removeItem(Item item) {
        inventory.removeItem(item);
    }
}

修改

有些人建议公开广告资源,然后在person.getInventory().addItem(item)上公开添加/删除方法。我认为这会违反Law of Demeter

答案 1 :(得分:0)

我认为库存类是最好的方式。您可以通过为PersonRoom内的广告资源创建一个getter来使用项目方法。

答案 2 :(得分:0)

根据您的业务领域,您可以拥有一个抽象的存储容器类,它们都可以继承。抽象存储容器上有方法,所以你仍然可以直接调用它们。

您还可以为两个类提供IStorageContainer的空接口,然后使用静态方法创建一个新的静态类,该方法接收IStorageContainer的第一个参数。

然后你可以调用AddItem(thisPerson,item)和RemoveItem(thisPerson,item),但是能够使用相同的代码和实现为这两个类重用这两个方法。