Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的压缩在哪里?_Java - Fatal编程技术网

Java中的压缩在哪里?

Java中的压缩在哪里?,java,Java,在创建必须验证条件的对象时,我反复遇到这个问题。应该在尝试创建对象之前进行检查,还是在对象本身的构造函数中进行检查 为了更好地说明这一点,这里有一个例子:假设我们有一位学生经理,一位教授,他将学生对象添加到他们的列表中。当创建新的student对象时,我们必须检查其名称的长度是否最多为20个字符 class Professor{ LinkedList<Student> studentsList; Professor(){ studentsList =

在创建必须验证条件的对象时,我反复遇到这个问题。应该在尝试创建对象之前进行检查,还是在对象本身的构造函数中进行检查

为了更好地说明这一点,这里有一个例子:假设我们有一位学生经理,一位教授,他将学生对象添加到他们的列表中。当创建新的student对象时,我们必须检查其名称的长度是否最多为20个字符

class Professor{
    LinkedList<Student> studentsList;

    Professor(){
        studentsList = new LinkedList<Student>();
    }

    public Student addStudent(String studentName){
        // Place 1
        if (studentName.length <= 20)
            studentList.add(new Student(studentName));
        else
             // Do another thing
    }
}

class Student {
    String name;

    Student(String studentName){
        // Place 2
        if (studentName.length <= 20)
            name = studentName);
        else
            // Don't create the object and throw exception 
    }
}
班主任{
LinkedList学生列表;
教授(){
studentsList=newlinkedlist();
}
public Student addStudent(字符串studentName){
//地点1

如果(studentName.length在简单的程序中,这并不重要。在复杂的应用程序中,有许多因素决定了这一点:

  • 在某些情况下,具有无效值的对象是否仍然存在?(即使它们包含无效值,它们是否也有其重要性?)
  • 验证是否昂贵?(是否需要计算、网络连接或数据库操作?)
  • 是否可以进行验证?(我们是否已经拥有验证所需的所有信息?)
  • 验证是否有自己的阶段,在此阶段,此对象与其他对象一起验证或与其他对象一起验证
  • 是否存在现有的惯例或要求
等等

所以,大多数情况下,这将由架构或设计约束或与大型应用程序相关的其他因素给出。在非常小的程序中,您可能找不到任何决定验证最佳位置的因素

在上面显示的示例对象创建代码中,通常不会自动跳过长度超过20个字符的值,但在这种情况下通常会引发异常。如果这是数据处理,而不是故意筛选长度小于20个字符的记录,则不希望自动忽略不合适的记录。(想象一下,谁会手动检查1000条记录中有5条记录丢失的原因,并且没有错误消息来指示出现了什么问题。因此,您可能会看到,上述方法无论如何都不是为了实际使用。)

对象自行负责 通常情况下,我们希望对象对自己负责。关于其内部状态完整性的业务规则应该在内部处理(或委托给构建器,请参见下文)。这一思想是OOP中正式称为的概念的一部分

因此,在您的示例中,
教授
类不应该担心
学生
类的规则,例如学生姓名的长度。
学生
类应该强制执行其自身的完整性。我们希望这些完整性规则的逻辑位于单个位置,而不是分布在整个应用程序中

事实上,
类不应该实例化
Student
对象。在您的示例中暗示,必须有其他方将学生分配给教授。可能是一个对象,负责跟踪由pr监督的少数学生的作业和进度本
教程
应实例化
学生
对象,或传递从其他来源(如数据库服务对象)接收的
学生
对象

学生
对象到达
教授
时,它们应该是有效的。
教授
班级不应该关心是什么使
学生
有效或无效。
教授
只应该关心是什么使
教授
有效或无效

class Professor{
    List< Student > students;
    …
    public void addStudent( Student student ){
        Objects.requireNonNull​( student , "Received NULL rather than a Student object. Message # 68a0ff63-8379-4e4c-850f-e4e06bd8378a." ) ;  // Throw an exception if passed a null object.
        Objects.requireNonNull​( this.students , "Collection of Student objects is NULL. Message # c22d7b22-b450-4122-a4d6-61f92129569a." ) ;  // Throw an exception if the `students` list is not established.
        this.students.add( student ) ;
    }
}

这取决于你。没有正确的答案。或者如果有一个惯例,哪一个是最常用的,我不得不不同意shmosel。如果要求阻止学生的名字超过20个字符,那么示例一是错误的答案。它只阻止在给定的示例中创建这样的学生,但不是全部。@Tom示例2也没有,因为可能有另一个构造函数没有检查。并且
name
可以在构造后修改。我们只能在提供的代码的上下文中进行回答。@shmosel您与OPs示例2的代码样式问题争论,以在涉及约束验证时为示例1的概念问题辩护吗?我不确定我怎么从来没有听说过直到现在,
java.util.Objects
类中的d。然后,我工作的最后一个主要java项目只有Java6。。。
StudentBuilder sb = new StudentBuilder().withFirstName( "Alice" ).withLastName( "Coleman" ).withEmail( "x@y.com" );
if( sb.isValid() ) {
    Student s = sb.build() ;
    …
}