gpt4 book ai didi

java - Java POJO 是否应该在 setter 方法中进行字段验证和抛出异常?

转载 作者:太空狗 更新时间:2023-10-29 22:39:59 24 4
gpt4 key购买 nike

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

在设计我的系统时,我很困惑应该在哪里放置任何验证逻辑。我的 POJO(域对象)代表我的数据,这些对象中的一些字段必须遵守特定的标准,但是如果我在我的 setter 方法中放置大量验证逻辑,那么告诉调用客户端的唯一方法是抛出异常。如果我不希望系统崩溃,则异常必须是必须捕获和处理的已检查异常。这样做的结果是,每次我使用 setter 方法(甚至构造函数)创建一个新对象时,我都会重新抛出该异常或使用 try-catch block 。被迫在许多 setter 方法上使用 try-catch 感觉不对。

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

我进行了研究和谷歌搜索,但没有找到关于这个主题的任何具体讨论,所以我怀着极大的热情等待着更深入地了解事情到底应该如何完成。

最佳答案

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

some of the fields inside of those objects must adhere to certain criteria

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

这些系统不变量形成了您的对象(或方法)与其“客户”之间的契约。如果有人试图违反(希望有详细记录的)契约(Contract)使用它们,抛出异常是正确的做法,因为客户有责任正确使用系统的各个部分。

随着时间的推移,对于任何违反契约(Contract)的情况,我开始偏爱未经检查的异常而不是已检查的异常,部分原因是您提到的原因,即避免 try-catch block 无处不在
Java 的标准未检查异常包括:

  • 空指针异常
  • 非法参数异常
  • 非法状态异常
  • UnsupportedOperationException

最佳实践指南是在错误被认为可恢复时使用检查异常,否则使用未检查异常

Joshua Bloch 的“Effective Java, 2nd ed.”第 9 章提供了关于此主题的更多智慧:

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

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

关于java - Java POJO 是否应该在 setter 方法中进行字段验证和抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29636277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com