Java 设计模式-验证输入参数&;创建holder类、J2SE(无框架等)
场景:例如,我们接收到两个关于对象的输入参数 课程有讲师姓名、学生人数、课程时间、房间号等 我们需要验证(学生人数>0、上午9点<时间<晚上9点等)输入并创建对象。我们需要返回无效输入的错误源 我可以想出两种方法 1) 使用静态方法创建单独的验证器类Java 设计模式-验证输入参数&;创建holder类、J2SE(无框架等),java,oop,design-patterns,object-oriented-analysis,Java,Oop,Design Patterns,Object Oriented Analysis,场景:例如,我们接收到两个关于对象的输入参数 课程有讲师姓名、学生人数、课程时间、房间号等 我们需要验证(学生人数>0、上午9点
- 验证输入,(validate方法返回true,或一些枚举,如VALID、INVALID_TIME、INVALID_STUDENT_NUMBER)李>
- 如果输入有效,则实例化Bean李>
- 如果我们必须在验证输入值之前对其进行处理,那么上面的模式会导致在输入有效时执行两次,一次在Validator类中,一次在bean setters之前。我们不能返回Bean对象,因为validate方法需要在无效的情况下返回错误源
- 需要创建多个自定义异常李>
- 在holder对象本身中包含validate方法是否正确
请帮助我了解上述方法的优缺点,以及更好的方法。正如上面所指出的,有很多方法可以做到这一点 如果我正在实现类似的东西,我会看看这篇文章 关于fluent接口与生成器模式的组合 也许它适合你的需要。特别注意bean部分的验证
希望它能有所帮助。一位评论员指出:“您希望最终得到一组验证错误。”这一点很重要 根据我的经验,模型对象内部的验证方法不起作用,因为验证逻辑经常更改,并且在一组情况下无效的东西在另一组情况下也是有效的。例如,如果验证方法认为晚上9点以后的课程无效,学校管理者可以更改规则,使暑期课程可以运行到晚上11点。当这种情况发生时,您不希望在类中使用验证方法,因为这是不可避免的 此外,在不了解系统中其他对象的状态的情况下,通常不可能验证对象。例如,如果您有一个贷款对象,超过$100000的贷款值可能无效,但客户对象类型为Institution时除外。您需要了解贷款和客户对象,才能正确验证贷款 我见过的复杂验证的最佳实践有:
验证框架可能会使用异常,但我建议不要这样做。例外情况应该保留给更难恢复的更严重的错误。此外,异常可能会导致严重的性能损失,如果验证是在服务器上而不是在客户机上进行的,这一点很重要。更糟糕的是,一些平台的异常处理不稳定 有很多方法可以做到这一点,包括您提到的,还有AOP、JSR-303实现、验证装饰器等等。您将希望最终得到一组验证错误。为什么不尝试一些想法呢?谢谢大家的帮助,我来看看