Java POJO是否应该具有字段验证并在setter方法中引发异常?

五木:

假设我们有数十个Java POJO,它们代表我的域,即系统中的数据作为对象在系统的不同层之间流动。该系统可以是Web应用程序,也可以是简单的桌面应用程序。域的内容并不重要。

在设计系统时,我很困惑应该在哪里放置任何验证逻辑。我的POJO(域对象)表示我的数据,并且这些对象内的某些字段必须遵守某些条件,但是如果我在设置方法中放入了很多验证逻辑,那么告诉调用方客户端的唯一方法是引发异常。而且,如果我不希望系统崩溃,则该异常必须是一个已检查的异常,必须对其进行捕获和处理。这样的结果是,每当我使用setter方法(甚至构造函数)创建一个新对象时,我要么重新抛出该异常,要么使用try-catch块。被迫在许多setter方法上使用try-catch感觉不对。

所以问题是我应该把验证逻辑放在哪里,这样我就不会因大量的样板try-catch块和重新抛出而使我的代码混乱。欢迎最优秀的JAVA字节食用者加入讨论。

我已经进行了研究和搜索,但没有找到关于此主题的任何具体讨论,因此我非常热​​情地等待,以便对真正应该做的事情有更深入的了解。

蜘蛛脑:

您说的时候可能已经回答了自己的问题

这些对象内部的某些字段必须遵守某些条件

考虑系统中不变量总是有帮助的,例如,您要不惜一切代价维护的事物或必须始终遵循的规则。
POJO是数据对象上此类不变量的“最后防线”,因此是放置验证逻辑的适当(甚至是必要的)地方。没有这种验证,对象可能不再代表您所在领域中有意义的东西。

这些系统不变式在对象(或方法)与其“客户端”之间形成契约。如果有人试图违反(希望有据可查的)合同使用它们,则抛出异常是正确的选择,因为正确使用系统的各个部分是客户的责任。

随着时间的推移,我已经开始有利于unchecked异常检查过那些为合同违约的任何情况,部分原因是你提到的原因,即为了避免try- catch随处可见
Java的标准未经检查的异常包括:

  • 空指针异常
  • IllegalArgumentException
  • IllegalStateException
  • UnsupportedOperationException

最佳做法准则是使用checked异常时,错误被认为是可回收unchecked异常,否则。

约书亚·布洛赫(Joshua Bloch)的“ 有效Java,第二版 ”的第9章提供了关于该主题的更多知识:

  • 项目57:仅在特殊情况下使用例外
  • 项目58:将可检查的异常用于可恢复的条件,将运行时异常用于编程错误
  • 项目59:避免不必要地使用检查的异常
  • 项目60:赞成使用标准例外

以上任何一项都不应该阻止您在更高级别上使用任何适当的验证逻辑,尤其是强制执行任何特定于上下文的业务规则或约束。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java:如何检查方法是否引发异常并在发生异常时终止?

是否有可能在服务器中引发异常并在Java中的客户端中捕获并处理该异常

Java最终阻塞并在方法级别引发异常

在Java接口的方法中引发多个异常

Java“空白的最终字段可能尚未初始化”方法奇数中引发异常

如何检查当前方法的参数是否具有注释并在Java中检索该参数值?

具有Groovy处理闭包引发异常的Java

在Java中引发异常重构

Swagger Java日期格式验证引发异常

在Java中验证证书会引发异常-无法找到到请求目标的有效证书路径

在JAVA中验证字段的更好方法

Java中是否有内部异常概念

具有必填属性的所有字段的Java验证

为什么我不能在方法中引发异常(Java)

Java-检查parseInt是否引发异常

是否有Java验证的注释,如果对象列表中的字段值重复?

在Java中,为什么自定义异常还应该具有arg作为“ Throwable cause”的构造函数

Java是否具有“同类”测试方法

如何使用 Scribe 进行 POST 调用并在 Java 中获取具有 OAuth 1.0 身份验证的数据?

如何使用Java Spring在MongoDB中检查特定字段是否具有特定值?

如何使用Java Spring在MongoDB中检查特定字段是否具有特定值?

重写的方法无法引发Java异常

从Java类的重写方法引发异常

Kotlin 中的 Getter 和 Setter 是否应该与 Android 中的 Java 相同

在Lambda中引发异常-Java 8

在Java中引发异常后继续执行

在Java中构建JSONObject而不会引发异常

有什么方法可以强制类在Java中具有public static final字段?

检查多个对象是否在java中具有相同的字段值并根据其他字段删除重复项