在 Java 中为学校建模

Modelling a School in Java

我一直在尝试为 Java 中的一所学校建模(没有主要方法,只有属性)。如何将 30 名学生和一名教师分配到一个 class 房间?(可以不用 main 方法吗?)

public class Person{
  private String name;
  private String surname;
  private String age;
  private String job;
}

public class Teacher extends Person{
  private String job = "teacher";
}

public class Student extends Person{
  private String job = "student";
}

private class Classroom{

  //  1 teacher and max. 30 students per classroom

}

我的最佳猜测:使用数组?

private Student[] students = new Student[30]; // there can be less students so would this be okay?
private Teacher classroomTeacher;

最后一个问题,使用“扩展”来创建教师和学生 class 是一种好的做法吗?如果没有,我该如何改进它?如果是这样,Person,Student,Teacher应该在同一个文件中还是分开?

public class School{
  private enum schoolTypes{
    ArtSchool,
    ScienceSchool,
    SportsSchool,
  }
  private Classroom classrooms;
  
}

如果我要创建一个学校 class 并指定一个 class 可以拥有的学生人数,我会使用 ArrayLists 还是 Arrays 就足够了?

你已经掌握了基本思路,但我会考虑以下几点:

您正在混合实施模式。我要么使用枚举来标记作业(不是字符串),要么使用子类,但不能同时使用。我会更倾向于自己的子类化;只需放弃 job 字段,这是不必要的。

至于学生列表,我会将 ArrayList 子类化并简单地覆盖 addaddAll 以检查其自身的大小并在尝试添加超过限制时抛出异常。

你的教室会变成这样:

public class Classroom {
    private Teacher teacher;
    private List<Student> students;

    public Classroom(Teacher teacher, List<Student> students) {
         this.teacher = teacher;
         this.students = new LimitedList(students, 30); //class you should make
    }
}

为清楚起见,将 name 更改为 givenName。参见 Wikipedia

private String givenName;
private String surname;

年龄应该是一个整数,而不是文本。

private int age;

如果在 compile-time 处已知所有可能的工作,请使用 Java 强大灵活的枚举工具。参见 Oracle tutorial

enum Job { TEACHER , ADMINISTRATOR , STUDENT } 

但实际上,你不需要这份工作。您有教师和学生的子classes。所以注意到他们的工作是多余的。

选择您想去的路线:

  • Person class 具有 job 类型 Job 枚举的成员字段。
  • 子classes Teacher & Student.

两条路线都有效,各有利弊。但不要将两者混为一谈。

您问的是:

is using "extends" to create teacher and student class a good practice?

是的,如果您选择上面两个项目符号中的第二个。

Classroom 应该是它自己的 class,而不是你标记的 private。是的,你可以使用数组。但是使用 Java Collections framework 更加灵活和方便。

public Classroom 
{
    private Teacher teacher ;
    private Set< Student > students ;

    … add constructor 

    … add getters, and possible setters

}

您问的是:

would I use ArrayLists or would Arrays be enough?

一般最好使用ListSet等集合。当速度至关重要或内存有限时,请使用数组。

您问的是:

should Person,Student,Teacher be in the same file or separated?

是的,通常最好将每个 class 保存在自己的 .java 文件中。使用 IDE 可以非常轻松地在文件之间导航:IntelliJNetBeansEclipse .

create a School class

public class School
{
    String schoolName ;
    Administrator principal ;
    Set< Classroom > classrooms ; 
    …
}

您问的是:

is it possible to do without a main method?

首先定义你的现实世界模型,就像你正在做的那样。决定你的“问题域”class的结构,例如学校、class房间、老师、学生等

main 方法是 运行 您的应用程序的入口点。这是您开始实例化对象的地方。您从用户、文件或数据库中获取输入,并使用该数据从您的 classes 中创建对象。

How do I assign 30 students and a teacher to a classroom?

在您的主要方法中,或稍后调用的某个方法中:

Set< Student > students = new HashSet<>() ;
students.add( new Student( … ) ) ;
students.add( new Student( … ) ) ;
…
Teacher teacher = new Teacher( … ) ;
Classroom classroom = new Classroom( teacher , students ) ;

您问的是:

specified the number of students a class can have

在 class 中设置学生人数限制是所谓的 data validation 的一部分。您必须为此编写代码,并在添加学生时检查限制。

Jakarta Bean Validation 框架可以帮助完成这项工作。 (对于实际工作,而不是简单的功课项目。)