是否可以在不声明类的情况下创建对象



是否可以在不声明类的情况下创建对象?就像在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 .

最新更新