Groovy 如何将布尔值传递给具有变量名的方法

Groovy 如何将布尔值传递给具有变量名的方法,groovy,Groovy,我有这样的方法 def uploadFile(String fileName, boolean performCleanup = false) { //upload file if (performCleanup == true) { //delete local file } } 我用两种方式调用此方法: uploadFile(“/some/path/to/file.txt”) uploadFile(“/some/path/to/file.txt”,true)

我有这样的方法

def uploadFile(String fileName, boolean performCleanup = false) {
   //upload file
   if (performCleanup == true) {
       //delete local file
   }
}
我用两种方式调用此方法:

  • uploadFile(“/some/path/to/file.txt”)
  • uploadFile(“/some/path/to/file.txt”,true)
  • 在第二种情况下,为了更好的可读性,我想传递一个变量名,它将表明传递
    true
    的意义

    类似于,
    uploadFile(“/some/path/to/file.txt”,performCleanup:true”)


    这可能吗?

    您可以使用
    映射来模拟命名参数:

    def uploadFile(Map args) {
       String fileName = args.fileName
    
       // will default to false if omitted
       boolean performCleanup = args.performCleanup
    
       //upload file
       if (performCleanup == true) {
           //delete local file
       }
    }
    
    然后可以使用

    uploadFile(fileName: "/some/path/to/file.txt")
    uploadFile(fileName: "/some/path/to/file.txt", performCleanup: true)
    
    与更典型的样式(其中每个值作为单独的参数传递)相比,此样式有一些优点和缺点:

    • 提高了呼叫站点的可读性
    • 声明站点可读性降低
    • 灵活性,例如,您可以向方法添加/删除参数,而无需更新每个调用方
    • 编译时安全性降低,例如,即使启用了静态编译,也无法判断每个调用方是否提供了所需的参数

    通过引入和额外的闭包,您可以创建一个可读性良好的微型DSL:

    def performCleanup = {
      println "cleanup $it" //delete local file
    }
    def upload(fileName) {
      println "upload file $fileName" //upload file
      [then: { action ->
        action(fileName)
      }]
    }
    
    upload "path"
    upload "path" then performCleanup
    

    我想建议以DSL方式使用它的另一种方法,返回一个可以响应
    performCleanup

    def uploadFile(String fileName) {
        //upload file
        println "uploading file"
    
        [performCleanup: { 
            //delete local file
            println "cleaning up" 
        }]
    }
    
    uploadFile 'file' performCleanup()
    
    输出:

    $ groovy Clean.groovy 
    uploading file
    cleaning up
    
    $ groovy Clean.groovy 
    uploading file
    
    如果不在之后调用
    performCleanup()
    ,则不会发生以下情况:

    uploadFile 'file'
    
    输出:

    $ groovy Clean.groovy 
    uploading file
    cleaning up
    
    $ groovy Clean.groovy 
    uploading file
    
    也许这篇文章会有帮助。