Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该在哪里存储对象的列表或地图_Java_Oop_Conventions - Fatal编程技术网

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

Java 我应该在哪里存储对象的列表或地图,java,oop,conventions,Java,Oop,Conventions,在我的项目中,我有几个对象,如布局、组、框和许多其他对象。这些对象需要存储在一个列表或映射中,其中包含获取、删除和放入集合的方法。我目前在关联类中使用静态方法和变量,例如: public class Layout { private static Map<String, Layout> layouts = new HashMap<String, Layout>(); /* Other, non-static variables */

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

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
     */
}
公共类布局{
私有静态映射布局=新建HashMap();
/*
其他非静态变量
*/
公共静态void addLayout(字符串名称、布局){
布局。放置(名称、布局);
}
公共静态布局getLayout(字符串名称){
返回布局。获取(名称);
}
公共静态void removeLayout(字符串名称){
布局。删除(名称);
}
/*
布局的非静态方法
*/
}

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

您的解决方案的优点是,您在一个类中拥有所有属于布局的名称,不需要更多的依赖项。但是使用静态方法会使使用该静态方法测试实现变得困难。我不会用一个类来容纳所有的类,那样会产生依赖磁铁

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

最简单的是通用实现:

public class Repository<E> {

  private final ConcurrentMap<String,E> elements = new ConcurrentHashMap<>();

  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);
  }
}
公共类存储库{
私有最终ConcurrentMap元素=新ConcurrentHashMap();
公共void add(字符串名称,E元素){
元素。put(名称、元素);
}
公共E get(字符串名称){
返回元素。get(name);
}
公共无效删除(字符串名称){
元素。删除(名称);
}
}
因此,存储库的实现与要存储的类分离。您可以使用文件或数据库简单地重新实现该功能,而无需接触使用它的代码

对于单元测试,您可以简单地模拟存储库,以确保其使用正确


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

如果不了解应用程序的更多信息,很难说清楚。你需要学习更多关于OO设计的知识…你为什么要使用静态?这无疑是你学习OO设计的一个机会,玩它,看看你能想出什么。在这个过程中,你可能会学到一些好东西。另外,如果要创建一个具有该映射的类,则一些名称将是
LayoutManager
LayoutConfiguration
LayoutFactory
()。只是一些想法。名称应该反映该类的功能,因为我不知道
布局是什么,所以很难说。@ScaryWombat不使用static是没有意义的,因为我需要能够在没有布局实例的情况下获得布局。那么使用factory类如何?