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类如何?