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);
        }
       }
      }
    }
  }
}