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

nap*_*011 4 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
}
Run Code Online (Sandbox Code Playgroud)

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

PS我通常会在谷歌搜索,但我不知道要搜索什么关键字。

Opa*_*pal 5

你可以做:

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
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 顺便说一句,`instanceOf` 与 _equal_ 不同。例如,所有此类都是“instanceOf Object”,但它们都不是“in [Object]”。因此,如果有人使用子进程或某些自动代理(aop、hibernate 等),它将失败 (2认同)

小智 5

好像是switch语句的工作,或者至少通常是为了避免if ... else if..else 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
}
Run Code Online (Sandbox Code Playgroud)

本文讨论了一些在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