定制科特林时表达
问题描述:
我真正的新科特林,和我想是这样的:定制科特林时表达
when_assert_no_else {
CONDITION0 -> {
doSomething0()
}
CONDITION1 -> {
doSomething1()
}
}
这工作就像
when {
CONDITION0 -> {
doSomething0()
}
CONDITION1 -> {
doSomething1()
}
else -> {
throw RuntimeException()
}
}
后者的代码片段显示了很多时间在我的项目中,我想断言控制流没有通过抛出异常到达else
块。
或者,是否可以通过实施when_assert_no_else
来自定义when
关键字?
有什么想法吗?谢谢。
答
由于kotlin没有->
运算符,所以不能写上面的代码,但可以做一些折衷,例如:使用Pair<()->Boolean,()->T>
代替。
fun test(): Int = when_assert_no_else(
{ true } to { 1 },
{ false } to { 2 }
)
fun <T> when_assert_no_else(vararg cases: Pair<() -> Boolean,() -> T>): T {
// v--- short-circuiting terminal operation
return cases.find{ it.first() }
.let { it ?: throw RuntimeException() }
.second()
}
答
我也想到了holi-java的解决方案,但它可能不足以满足所有情况。例如,考虑分支机构的副作用。
你可以做的也是“抽象”else分支。我的意思是你创建一个(静态)类,并添加一个方法when_assert_else。在_when_assert_else_方法中,你添加了你在那个时候的else分支中执行的代码。与当前策略相比,优势在于,如果您想更改其他分支,则必须遍历所有代码并将其更改为x次。通过函数调用,您只需修改一次即可。