我应该在哪里存储对象的列表或地图

时间:2014-07-09 04:07:57

标签: java oop conventions

在我的项目中,我有几个对象,如布局,组,框和许多其他。这些对象需要存储在列表或映射中,并使用方法来获取,删除它们并将它们放入集合中。我目前在关联类中使用静态方法和变量,例如我有:

public class Layout {
    private static Map<String, Layout> layouts = new HashMap<String, Layout>();
    /*
    Other, non-static variables
     */

    public static void addLayout(String name, Layout layout) {
        layouts.put(name, layout);
    }

    public static Layout getLayout(String name) {
        return layouts.get(name);
    }

    public static void removeLayout(String name) {
        layouts.remove(name);
    }

    /*
    Non-static methods for layout
     */
}

拥有一个单独的类来保存每种对象的集合或单个类来保存所有对象的集合会更好吗?如果是这样,你会为这些类使用什么类型的名称?

1 个答案:

答案 0 :(得分:2)

您的解决方案的优点是您在一个类中拥有所有属于Layout,不再需要依赖项。但是使用静态方法会很难使用静态方法测试实现。我不会使用一个类来保持所有,这将创建一个依赖磁铁。

更好的方法可能是为每个类创建存储库,例如LayoutRepository,用于存储和检索布局。如果应用程序变大,最好使用像Spring这样的容器实现的依赖注入。

最简单的是通用实现:

public class Repository<E> {

  private final Map<String,E> elements = new HashMap<>();

  public void add(String name, E element) {
    elements.put(name, element);
  }

  public E get(String name) {
    return elements.get(name);
  }

  public void remove(String name) {
    elements.remove(name);
  }
}

因此,您要将存储库的实现与要存储的类分开。您只需使用文件或数据库重新实现功能,而无需使用它来触摸代码。

对于单元测试,您只需模拟存储库以确保正确使用它。

如果创建了该类,例如布局必须确保有效状态,建造者将是一个很好的改进。另一种选择是使用工厂来控制实例的创建。两者都应该放在与元素类和构造函数相同的包中,而不能再公开。