Gog*_*ogi 17 java oop validation pojo
假设我们有几十个代表我的域的java POJO,也就是我系统中的数据,它作为我系统不同层之间的对象流动.该系统可以是Web应用程序,也可以是简单的桌面应用程序.域包含的内容并不重要.
在设计我的系统时,我很困惑我应该放置任何验证逻辑.我的POJO(域对象)代表我的数据,这些对象中的一些字段必须符合某些条件,但如果我在我的setter方法中放入了很多验证逻辑,那么告诉调用客户端的唯一方法是抛出异常.如果我不希望系统崩溃,则异常必须是必须捕获和处理的已检查异常.这样做的结果是每次我使用setter-methods(甚至构造函数)创建一个新对象时,我都会重新抛出该异常或使用try-catch块.在许多setter方法上强制使用try-catch是不对的.
所以问题是我应该把我的验证逻辑放在哪里,这样我就不会在我的代码中混淆大量的样板try-catch块和重新抛出.欢迎最优秀的JAVA字节用户加入讨论.
我已经研究过Google,但没有找到关于这个主题的具体讨论,所以我非常热情地等待,以便更深入地了解事情应该如何完成.
fsp*_*irn 15
你说的时候,你可能已经回答了自己的问题
这些对象内的一些字段必须符合某些标准
考虑系统中的不变量总是有帮助的,即您想要不惜一切代价维护的东西或必须始终遵循的规则.
您的POJO是数据对象上此类不变量的"最后一道防线",因此是一个适当的 - 甚至是必要的 - 放置验证逻辑的地方.如果没有这样的验证,对象可能不再代表您域中有意义的内容.
这些系统不变量在您的对象(或方法)与其"客户端"之间形成契约.如果某人试图使用它们(与希望记录良好的合同)相反,抛出异常是正确的做法,因为客户有责任正确使用系统的各个部分.
随着时间的推移,我开始了检查者的违反合同的情况下,任何有利于unchecked异常,部分原因是因为你提了,即避免了原因try- catch块随处可见.
Java的标准未经检查的例外包括:
最佳做法准则是使用checked异常时,错误被认为是可回收和unchecked异常,否则.
Joshua Bloch的第9章" Effective Java,2nd ed. "为这个主题提供了更多的智慧:
以上都不能阻止您在更高级别使用任何适当的验证逻辑,尤其是强制执行任何特定于上下文的业务规则或约束.