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

时间:2012-02-16 14:15:02

标签: groovy

是否可以在不声明类的情况下创建对象?就像在JavaScript中一样 obj = {a: '1'}; console.log(obj.a)

4 个答案:

答案 0 :(得分:69)

在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 class可能更类似于JavaScript对象,当你想要避免定义一个类的“开销”,或者想要一个可以添加任意属性的动态对象时,它很有用。运行时。

答案 1 :(得分:27)

有人没有提到过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")

打印输出:

DEF

ABC

groovy.lang.MissingPropertyException

ABC(如果你在map.run中注释掉println($ a),println($ b)打印出ABC)

忽略输出中的额外换行符。有一段时间把def和ABC放在连续的线上。

有关详细信息,请参阅Expando API documentation

答案 2 :(得分:1)

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)

这里我没有直接打印对象。由于它将以方括号符号打印。

阅读全文。适用于javascript开发人员的Groovy。 https://metamug.com/article/groovy-for-javascript-developers.php

答案 3 :(得分:0)

您可以使用literal map

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