Android/Java的正确代码设计
代码设计问题 我有一个类,比如说Android/Java的正确代码设计,java,android,android-fragments,Java,Android,Android Fragments,代码设计问题 我有一个类,比如说Area,它有一个名为schools的私有实例变量。在区域的构造函数中,我初始化了所有学校,因为这是一个耗时的过程。区域中有一个实例方法,表示通过学生名单的学校分组。我把这些学生分组到他们的学校,然后把结果传回去 对于这个区域班级来说,维护一份学校列表以及分组是否责任过重?但我的主要问题是与Android相关的: 我有多个片段需要使用这个类。他们利用学校的数量、学校列表以及分组。我不想每次打开新片段时都实例化这个区域。我应该在片段或其他地方的何处以及如何实例化它们
Area
,它有一个名为schools
的私有实例变量。在区域
的构造函数中,我初始化了所有学校,因为这是一个耗时的过程。区域
中有一个实例方法,表示通过学生名单的学校分组。我把这些学生分组到他们的学校,然后把结果传回去
对于这个区域
班级来说,维护一份学校列表以及分组是否责任过重?但我的主要问题是与Android相关的:
我有多个片段需要使用这个类。他们利用学校的数量、学校列表以及分组。我不想每次打开新片段时都实例化这个
区域。我应该在片段或其他地方的何处以及如何实例化它们?我不能让它成为一个单件,因为区域可以改变,反过来它需要重新实例化自己。我不能在它上调用setSchools
,因为这是一次性的事情。有什么想法吗?有没有一种设计模式我可以遵循?我的想法是有一个类来处理区域的创建(可能是您的应用程序类)
然后,应用程序基本上可以将区域地图保留为某种形式的区域id。如果您发现一个尚不存在的区域,您可以在该点创建该区域,并将其存储在地图中,供其他片段稍后使用
关于学生的分类,这似乎不是一个地区的工作。
也许使用像学生管理器这样的东西会更有意义
这就是我的想象(以简化的形式):
班级学生{
字符串名;
}
班级学校{
列出学生名单;
布尔包含(学生){
返回学生。包含(学生);
}
}
班级面积{
列出学校名单;
}
班级学生经理{
地图分类学校(收集未分类学生){
Map result=new HashMap();//此处应使用修饰的映射
用于(学生:未分类的学生){
用于(面积:面积){
用于(学校:地区。学校){
if(学校包含(学生)){
结果。获取(学校)。添加(学生);
}
}
}
}
}
}
我相信您可以改进StudentManager类的排序,但这种分离对我来说有一定的意义…嘿,您能展示一下您的代码吗?那么您是如何做到这一点的?问题是我根本看不到地图的意义。当用户对这些区域甚至不感兴趣时,为什么要存储这些区域呢。现在,我们可以使用LRUCache,然后有一个小尺寸,但我仍然觉得这是一个开销,什么应该/可能是一个简单的设计,我想你真的有两个选择在这方面。(1) 将项目存储在内存中或(2)将它们存储在数据库/LRUCache中,并在需要时检索它们。不管是哪种方式,在我看来,如果你不知道更多,那么当你无论如何都需要使用它们时,就很难避免将所有的区域
拉入内存。我认为这一切都归结为什么对你的特殊情况更有效。将所有数据保存在内存中,或者在需要时将其拉入内存。这将完全取决于此数据在特定应用程序中的使用方式。
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);
}
}
}
}
}
}