scala – 对case类值执行约束的正确方法是什么?
在施工时抛出的异常通常被视为不是很有礼貌的事情,但是我不知道如何避免在试图强制执行case类值的约束的时候.
例如,我需要表示一个范围,并且两个边界必须是积极的.立即执行将是: case class Range(from: Int,to: Int) 然而,这并不能确定来自和是否是积极的,也不能确定. 我的第一本能就是实现如下: case class Range(from: Int,to: Int) { require(from >= 0) require(to >= 0) require(to >= from) } 但是,这使得Range的构造函数不安全. 有没有一个共同的模式来保持案例类的易用性,强制实施价值约束,并避免抛出异常? 解决方法
这很主观,但我会试试.
这取决于你的班级建成.在内部代码中随便使用的简单实用程序类的情况下,任何使用它的程序员都应该意识到,输入范围错误的值可能会导致奇怪的结果.你可以假设这些类的真正用法真的不会遇到这个问题,而在这些罕见的情况下抛出一个例外可能不是一个坏的做法,表明一个人真的搞砸了.如果从背景中显而易见,应该向课堂提供哪些价值观,如果人们不能达到这些理智的期望,我不认为抛出异常特别不好. 将这与NullPointerExceptions或ArithmethicExceptions的行为进行比较,这些异常仍然会在Scala中发生.有时,面对足够的“精神错乱”时,防守进行防守是不合理的. 另一方面,如果你的班级是用价值来填补的,那么你的控制权就越少,就是用户输入的直接后果,你必须更好地控制你的建设.使用返回Option或Function的函数创建一个伴随对象: object Range { def createSafe(from: Int,to: Int): Option[Range] = { if(from >= 0 && to >= 0 && to >= from) Some(Range(from,to)) else None } } 您甚至可以通过覆盖应用作为其他答案建议来重用您的案例类实例化中的验证逻辑. object Range { def createSafe ... def apply(from: Int,to: Int): Range = { createSafe(from,to).getOrElse(throw new IllegalArgumentException(...)) } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |