2017-07-02 81 views
1

我真正的新科特林,和我想是这样的:定制科特林时表达

when_assert_no_else { 
    CONDITION0 -> { 
     doSomething0() 
    } 
    CONDITION1 -> { 
     doSomething1() 
    } 
} 

这工作就像

when { 
    CONDITION0 -> { 
     doSomething0() 
    } 
    CONDITION1 -> { 
     doSomething1() 
    } 
    else -> { 
     throw RuntimeException() 
    } 
} 

后者的代码片段显示了很多时间在我的项目中,我想断言控制流没有通过抛出异常到达else块。

或者,是否可以通过实施when_assert_no_else来自定义when关键字?

有什么想法吗?谢谢。

回答

1

由于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() 
} 
0

我也想到了holi-java的解决方案,但它可能不足以满足所有情况。例如,考虑分支机构的副作用。

你可以做的也是“抽象”else分支。我的意思是你创建一个(静态)类,并添加一个方法when_assert_else。在_when_assert_else_方法中,你添加了你在那个时候的else分支中执行的代码。与当前策略相比,优势在于,如果您想更改其他分支,则必须遍历所有代码并将其更改为x次。通过函数调用,您只需修改一次即可。