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