我想检查一些Scala编程的最佳实践,因为我是Scala的新手。我在网上读到了Scala除了"例外"之外通常不会使用异常的情况。情况(不包括参数检查)。现在在我的项目中我使用了很多require
,所以我想知道更好的类型检查方法是什么。
例如,如果我有一个班级
class Foo(String bar){
require(StringUtils.isNotEmpty(bar), "bar can't be empty")
}
我检查酒吧的替代方案是什么?我是否像这样创建一个伴侣对象
Object Foo {
def apply(bar: String) = Try[Foo] {
bar match = {
case null => Failure("can't be null")
//rest of checks
case _ => Success[Foo]
}
}
或者我应该使用Option吗?
另外,对于scala方法,如何检查方法的参数?如果我已经返回一个Option,如果我得到一个错误的参数,我是否只返回一个空选项?这并不意味着当我使用方法的返回时我必须检查一个空选项并且不会抛出异常允许更具体的消息吗? (例如,运行时异常不能使用空值)。
答案 0 :(得分:2)
我认为你的伴侣对象的Success部分也会返回Foo()对象吗?
Object Foo {
def apply(bar: String) = Try[Foo] {
bar match = {
case null => Failure("can't be null")
//rest of checks
case _ => Success[Foo](new Foo(bar))
}
}
要使用它,您可以使用从Foo(bar)获得的Success
做一些事情:
val hehe = Foo(bar).map(foo => foo.someString()).getOrElse('failed')
Try方法将自动包装someString()生成的异常,或者在Failures中包含的其他内容。如果您想检查foo.someString()
的参数,则可以执行与apply()
方法类似的操作。它与在条件上抛出异常并没有太大的不同,但我认为它更好,因为“catch block”将在recover()
或recoverWith()
中。如果您的代码不是设计为从上到下链接Try
,则始终可以使用getOrElse()
退出Try
。