是否可以在不声明类的情况下创建对象?就像在JavaScript中一样 obj = {a: '1'}; console.log(obj.a)
在Groovy中,你必须始终提供正在创建的对象的类,所以Groovy中没有等效于JavaScript的对象文字语法。
然而,Groovy确实有一个Map
的文字语法,它在概念上与JavaScript对象非常相似,即两者都是属性或名称-值对的集合。
与上面的JavaScript等效的Groovy代码是:
def obj = [a: '1']
println obj.a
即使这里没有使用类名,您仍在创建特定类的对象(java.util.LinkedHashMap
(。上面的代码只是以下代码的简写:
def obj = new LinkedHashMap();
obj.a = '1'
println obj.a
Expando
类可能更类似于 JavaScript 对象,当您想要避免定义类的"开销"或想要一个可以在运行时添加任意属性的动态对象时,它很有用。
有点惊讶没有人提到 Expando 类。 这在映射上增加了额外的功能,因为您可以直接引用函数中的属性。 下面的代码示例。
def expando = new Expando(a:"def")
expando.run = {def b ->
println("$a")
println("$b")
}
expando.run("ABC")
def map = [a:"def"]
map.run = {def b ->
println("$a") //THIS DOES NOT WORK. You will get a missing property exception.
println("$b")
}
map.run("ABC")
打印输出:
定义
美国广播公司
groovy.lang.MissingPropertyException
ABC(如果你在map.run中注释掉println($a(,println($b(会打印出ABC(
忽略输出中多余的换行符。 有一段时间把 def 和 ABC 放在连续的线上。
有关更多信息,请参阅 Expando API 文档。
Groovy对json有一个等效的表示法。唯一的区别是它们使用 [:] 而不是 {} 作为地图。因此,您可以清楚地将 json 转换为时髦的对象表示法。
import groovy.json.JsonOutput
def obj = [:] //define map
obj.batsmen = [] //define array
def b = [:]
b.name= "V. Kohli"
b.score = 55
b.strike = false
obj.batsmen.push(b)
//push second object
obj.batsmen.push(b)
println JsonOutput.toJson(obj)
在这里,我没有直接打印对象。因为它会用方括号表示法打印。
阅读整篇文章。Groovy for JavaScript developer。https://metamug.com/article/groovy-for-javascript-developers.php
您可以使用文字映射:
config = [
host : '0.0.0.0',
user : 'user1',
password: 'pass'
]
println("""
HOST: ${config.host}
USER: ${config.user}
PASS: ${config.password}
""")
您还可以将文字映射作为函数返回值返回,而无需定义自定义类,例如
return [status: 200, body: 'abcdef']
,然后在调用方访问值,例如使用response.status
.