在检查对象的多个实例时,是否有更常规的方法来实现if..else if..else?

时间:2015-08-26 05:44:22

标签: groovy

我目前正在研究某些事情,我在想是否有一种更加时髦的方式来实现这一点:

if ( reqObj instanceof Order ) {
    params.body = reqObj
}
else if ( reqObj instanceof PaymentRequest ) {
    params.requestContentType = ContentType.JSON
    params.body = reqObj
}
else if ( reqObj instanceof ShipmentRequest ) {
    params.body = reqObj
}
else if ( reqObj instanceof StockLocationRequest ) {
    params.body = reqObj
}
else if ( reqObj instanceof StockItemRequest ) {
    params.body = reqObj
}
else if ( reqObj instanceof StockMovementRequest ) {
    params.body = reqObj
}
else if ( reqObj instanceof ZoneRequest ) {
    params.body = reqObj
}
else{
    params.query = reqObj
}

正如您所看到的,我正在检查执行相同操作的对象的多个实例,但是如果它们是该类的实例,则需要检查它们,以便它们不执行params.query并执行此操作params.body如果返回true。有没有更古老的方法来做到这一点?

P.S。我通常会在谷歌搜索,但我对要搜索的关键词毫无头绪。

2 个答案:

答案 0 :(得分:5)

看起来像switch语句的工作,或者至少通常是为了避免永远长时间而实现的...如果... else ifel if ... else类型结构。看到groovy可以处理switch语句中的对象,你不必在变量之间使用它来使它工作。所以最终可能是这样的:

switch (reqObj) {

    case {it instanceof Order}:
        result: params.requestContentType = ContentType.JSON
                params.body = reqObj
        break
    ...

    default:
        result: params.query = reqObj
        break
}

本文讨论了使用groovy在switch语句中使用自定义对象的能力,尽管我认为在他们的示例中他们使用toString()方法并在case语句中使用字符串值进行比较。 http://www.javaworld.com/article/2073225/groovy--switch-on-steroids.html

另一方面,此站点使用各种对象属性显示切换,包括instanceof语句http://mrhaki.blogspot.com/2009/08/groovy-goodness-switch-statement.html

答案 1 :(得分:3)

你可以这样做:

def cls = reqObj.getClass()

if (cls in [Order, PaymentRequest, ]) { //other classess
   params.body = reqObj
} else {
   params.query = reqObj
}

if (cls in [PaymentRequest,]) { // may be instanceof as well
   params.requestContentType = ContentType.JSON
}

也可以使用三元运算符(但这可能不可读):

(cls in [Order, PaymentRequest,] ? {params.body = reqObj} : {params.query = reqObj})()

if (cls in [PaymentRequest,]) { // may be instanceof as well
   params.requestContentType = ContentType.JSON
}