有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

设计Java类的最佳方法?

我希望我问的是正确的问题。这只是出于我的好奇心,因为我不是一个经验丰富的开发人员,我只是想听听你们的意见,什么是设计类的好方法。是否有任何标准方法或其中一种方法可以实施?我只是想知道创建类的传统方式是什么,或者你的方式是什么

备选案文1:

public class Student{
    private String name;
    private String address;

    public Student(String name, String address){
        this.name = name;
        this.address = address;
    }

    public void addStudent(){
        //add name and address to database.
    }
}

备选案文2:

public class Student{

    public void addStudent(String name, String address){
        //add name and address to database.
    }

    public void addAllStudent(List Student){
        //loop and add each student to database
    }
}

方法调用:

//option 1:
Student s = new Student("abc","xyz");
s.addStudent();
//for list,
for(int i=0;i<list.length;i++){
    Student s = new Student(list[i].name, list[i].address);
    s.addStudent();
}

//option 2:
Student s = new Student();
s.addStudent("abc","xyz");
s.addAllStudent(list);

共 (6) 个答案

  1. # 1 楼答案

    正如你所看到的,在这个问题上有很多意见,所以我去补充另一个;)

    有人评论说,在创建类的新实例时没有“银弹”可供使用。这几乎击中了靶心。有很多方法,直接通过构造函数、静态方法或封装在工厂中。甚至有非常好的参数通过reflections创建实例

    如何将学生保存到数据库中也是如此。有许多模式可能是有效的。只要确保您了解这种模式是如何工作的,以及它的优点和缺点是什么。同样重要的是,在代码中使用它

    关于您的代码,如果您更改为建模透视图,则选项2没有意义。向学生添加学生?除非你不想造成一堆人为的学生,否则你最好将学生加入课程、班级、学校

  2. # 2 楼答案

    您可以尝试以下方法:

    1. 创建一个Studentbean

      public class Student {
          private String name;
          private String address;
      
          public Student(String name, String address) {
              this.name = name;
              this.address = address;
          }
      
          // generate the getters and setters
      }
      
    2. 创建DAO

      public class StudentDaoIml {
          public void addStudent(Student student) {
              // do the add student job here
          }
      
          public void addAll(List<Student> students) {
              // the code goes here
          }
      
          public void deleteStudent(Student student) {
      
          }
      
          ...
      }
      
    3. 最后,您可以这样使用它:

      StudentDaoIml stDao = new StudentDaoIml();
      for(int i=0;i<someValue; i++){
          Student s = new Student(list[i].name, list[i].address);
          stDao.addStudent(s);
      }
      
  3. # 3 楼答案

    这里有一个很好的方法,在评论中有一些解释

    public class Student{
        private String name;
        private String address;
    
        public Student(String name, String address){
            this.name = name;
            this.address = address;
        }
    
        public void save(){
            //save this instance to database.
        }
        public static void saveAll(List<Student> students){
            //Either iterate and call save
            // or do better batch insert for better performance
        }
    }
    

    就命名方法而言,类方法是根据其行为命名的。把它想象成告诉一个学生“去把自己保存到数据库中”。还有一种方法,比如“去数据库中更新自己”

    当你处理一个列表时,列表本身不应该是学生课堂的一部分。把清单放在别的地方。但是,学生类可以有一个静态方法,它获取学生列表并一次性保存

    例如,学生可能在学校的一个班级。然后

    Student.saveAll(class5A.getStudents());
    

    创建一些并保存它们:

    List<Student> students = new ArrayList<>();
    for(int i=0;i<10;i++){
        Student s = new Student("Student" + i, "Student address " + i);
        students.add(s);
    }
    
    Student.saveAll(students);
    

    更进一步说,学生课堂可能不应该处理大量拯救学生的问题。所以,让我们解除它的责任,让这批人来处理

    public class Student{
        private String name;
        private String address;
    
        public Student(String name, String address){
            this.name = name;
            this.address = address;
        }
    
        public void save(){
            //save this instance to database.
        }
    }
    
    public class BatchOfClass{ //Students who are in grade 6 in 2016
        private String className;
        private String batchName;
        private List<Student> students;
    
        public BatchOfClass(...){
        }
    
        public void save(boolean saveStudents){
            //save this instance to database.
            //This would also save the students to DB if saveStudents==true
        }
    }
    
  4. # 4 楼答案

    选项2并不好,因为这两种方法实际上与它们所属的学生对象无关。您可以将这两种方法设置为静态。选项1是Student类的“正确”方式,但方法addStudent()是错误的。您可以在数据库中有一个方法并调用database.addStudent(objStudent)。 您还可以将Student类中的addStudent方法更改为addToDatabase(Database db)甚至

    static void addToDatabase(Student student, Database db)
    

    在列表作为数据库的特定情况下,根本不需要自定义add方法,因为List allready具有add方法

    在最简单的情况下,这一切归结为:

    List<Student> students = new ArrayList<Student>();
    students.add(new Student("Max", "###"));
    

    如果您认为第二行太复杂,可以在Student中创建静态方法:

    public static void addStudent(String name, String address, List<Student> students)
    {
        students.add(new Student(name, address);
    }
    

    然后你可以这样使用它:

    List<Student> students = new ArrayList<Student>();
    Student.addStudent("Max", "###", students);
    

    出于个人喜好,我不会做后者。这个方法对列表的实际作用不够透明,这让我有点烦。在第一种情况下,简单地使用list的add方法没有什么错

  5. # 5 楼答案

    嗯。。。第一件事第一。。。aStudent和aList<Student>之间存在差异

    通常您会创建一个类Student

    public class Student{
      private String name;
      private String address;
    
      public Student(String name, String address){
        this.name = name;
        this.address = address;
      }
    
      // and some getter
    }
    

    在代码的其他地方,您可以使用java列表(不在学生类中)

    List<Student> students = new ArrayList<Student>();
    Student peter = new Student("Peter", "somewhere");
    Student frank = new Student("Frank", "somewhere else");
    students.add(peter);
    students.add(frank);
    

    被截取的代码可能在你的SubscribeStudentToCourseService左右

    您想做的是-单一责任:

    创建一个只负责一件事的类:

    • 将学生表示为java模型的StudentClass
    • 代表课程的课程(可能带有List<Student>字段,供访问该课程的学生使用)
    • 也许您编写了一个服务来为学生订阅课程
  6. # 6 楼答案

    似乎您正在使用同一个类为学生提供模板,并存储学生

    你真的需要把学生存储在同一个班级吗?这将导致一些令人困惑的设计,其中有一个Student类存储实际代表一个Student的其他Student类

    也许添加学生的功能可以在单独的班级中,例如在学校?或者你只要在需要的地方创建一个学生的通用列表。因此addStudent函数可能会从类中删除并存储在其他地方