Android/Java的合适代码设计

4

代码设计问题

我有一个类,假设叫做Area,它有一个私有实例变量叫做schools。在Area的构造函数中,我初始化所有学校,因为这是一个耗时的过程。在Area中有一个实例方法,用于按学校分组,传入一个学生列表。我将这些学生分组到他们所在的学校,并返回结果。

这个Area类是否承担了太多的责任,既要维护学校列表,又要进行分组?但我的主要问题与Android相关: 我有多个片段需要使用这个类。它们使用学校数量、学校列表以及对它们进行分组。我不想每次打开一个新片段就实例化这个Area。在片段或其他地方应该在哪里和如何实例化它?我不能将其设置为单例,因为area可能会改变,因此需要重新实例化。我无法对其调用setSchools,因为这只需要一次。有什么想法吗?是否有一个设计模式可以遵循?


嘿,你能展示一下你的代码吗? - Ando Masahashi
你对这个怎么样了? - Dylan Watson
1个回答

0

我的想法是创建一个处理区域创建的类(可能是您的应用程序类)。

然后,应用程序可以基本上保持一张区域地图和某种形式的区域ID。如果您发现尚不存在某个区域,则可以在该点创建它并将其存储在地图中以供其他片段稍后使用。

关于学生排序,这似乎并不是区域的工作。也许使用类似于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类的排序,但是这种分离对我来说有些意义...


事实上,我根本看不出使用地图的意义。当用户对这些区域没有兴趣时,为什么要存储它们呢?现在,我们可以使用LRUCache并且将其大小设置得很小,但我仍然觉得这对于本应该是简单设计的东西来说是一种负担。 - user3476555
我认为在这方面你真的有两个选择。(1)将项目存储在内存中或(2)将它们存储在数据库/LRUCache中,并在需要时检索它们。无论哪种方式,在没有更多信息的情况下,当您需要使用它们时,似乎很难避免将所有“区域”都拉入内存。我认为这归结于什么对于您特定情况的性能更好。将所有数据保留在内存中,还是在需要时将其拉入内存。 这完全取决于此数据在您特定应用程序中的使用方式。 - Dylan Watson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接