Null检查构造函数和服务方法?

And*_*ndy 5 java oop soa object

这是我们的一个代码评论中的一个主题,我想要更多的意见.

假设我正在编写一个允许我将简单的Person对象插入数据库的服务.

public class Person
{
   private String name;
   ....
}
Run Code Online (Sandbox Code Playgroud)

我们有一个简单的VerifyNotNull方法抛出IllegalArgumentException.

你会采取哪种方式和原因.

选项1:

在Person对象的构造函数中验证不为null.

public Person(String name)
{
     VerifyNotNull(name);//throws illegal arg exception if name is null
     this.name = name;
}
Run Code Online (Sandbox Code Playgroud)


选项2:

允许Person用null构造,在addPerson调用时验证不为null.

public class PersonService
{
  public void addPerson(Person personToAdd)
  {
     VerifyNotNull(personToAdd.getName());//throws illegal arg exception
     //add code
  }
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢在构造函数中抛出Exceptions的想法.对我来说选项2感觉正确,但我不知道如何解释或证明它.

在构造函数中抛出异常是否可以接受?

谢谢你的帮助!

Str*_*ior 10

第一种方法更快失败,这将增加您更快地找到错误来源的可能性.可以这样想:如果您的错误日志开始告诉您由于您尝试添加具有空名称的人而出现了许多错误,那么您将需要知道这些人的空名来自哪里, 对?根据系统的结构,人员可能会在距离人员加入服务的地方创建数英里.因此,您不知道代码中的四千个位置中的哪一个正在创建没有名称的人.

因此,如果我必须选择,我会选择第一个选项.

当然,这取决于您的商业模式.如果一个人在数据输入阶段创建一个完全合法的东西,那么只有当你准备好坚持要确保它通过验证的那个人的信息时,那么这是一个不同的故事.在这种情况下,您甚至可能想要一个ValidatedPerson包装的类Person,但以类型安全的方式指示addPerson只有在有人通过验证过程时才能调用该方法,因为创建a的唯一方法ValidationPerson是通过validate检查人名的具体方法.


Jan*_*omä 5

我会在Ctor中抛出异常.主要原因是:

  • 它甚至不允许创建无效的Person对象.
  • 您不需要在应用程序中使用Person对象的每个点检查Person对象是否有效.
  • 异常抛出的代码更接近导致无效Person对象存在的代码(例如,在创建对象时调用它,而在代码中,当知道谁已经处理了对象时).
  • 代码将快速失败 - 这是一个很好的做法.

如果您使用的是IntelliJ,您还可以使用JetBrain的@NotNull和@Nullable注释,因此如果您使用null参数调用Ctor,IDE也会发出警告.请参阅http://www.jetbrains.com/idea/documentation/howto.html.