代码设计问题
我有一个类 Area
,它有一个名为 schools
的私有(private)实例变量。在 Area
的构造函数中,我初始化了我所有的学校,因为这是一个耗时的过程。 Area
中有一个实例方法,表示按传递学生列表的学校分组。我将这些学生分组到他们的学校并传回结果。
Area
类既要维护学校列表又要进行分组,是不是责任太大了?但我的主要问题是 Android 相关的:
我有多个需要使用此类的 fragment 。他们利用学校的数量、学校列表以及对它们进行分组。我不想每次打开新 fragment 时都实例化此 Area
。我应该在哪里以及如何在 fragment 或其他地方实例化它们?我不能将它设为单例,因为 area
可以更改,反过来它需要重新实例化自己。我不能一次性调用 setSchools
。有任何想法吗?有没有我可以遵循的设计模式?
最佳答案
我的想法是有一个类来处理区域的创建(可能是您的应用程序类)。
然后,应用程序基本上可以将区域 map 保存到某种形式的区域 ID。如果您找到一个尚不存在的区域,您可以在此时创建它并将其存储在 map 中以供其他 fragment 稍后使用。
关于学生的排序,这似乎不是一个区域的工作。
也许使用像 StudentManager
这样的东西会更有意义。
这就是我的想象(简化形式):
class Student {
String name;
}
class School {
List<Student> students;
boolean contains(Student) {
return students.contains(student);
}
}
class Area {
List<School> schools;
}
class StudentManager {
Map<School, Set<Student>> sortIntoSchools(Collection<Student> unsortedStudents) {
Map<School, Set<Student>> result = new HashMap<>(); // Should use a decorated map here
for(Student student : unsortedStudents) {
for(Area area : areas) {
for(School school : area.schools) {
if(school.contains(student)){
result.get(school).add(student);
}
}
}
}
}
}
我相信您可以改进 StudentManager 类排序,但这种分离对我来说有些意义...
关于java - 适用于 Android/Java 的正确代码设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23096641/