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

fed*_*lov 58 groovy

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

Dón*_*nal 72

在Groovy中,您必须始终提供正在创建的对象的类,因此Groovy中没有等效的JavaScript对象 - 文字语法.

但是,Groovy确实有a的字面语法Map,它在概念上与JavaScript对象非常相似,即两者都是属性或名称 - 值对的集合.

上面JavaScript的等效Groovy代码是:

def obj = [a: '1']
println obj.a
Run Code Online (Sandbox Code Playgroud)

即使这里没有使用类名,你仍然在创建一个特定类的对象(java.util.LinkedHashMap).上面的代码只是简写:

def obj = new LinkedHashMap();
obj.a = '1'
println obj.a
Run Code Online (Sandbox Code Playgroud)

本Expando类或许更类似于JavaScript对象,当你想要避免定义一个类的"开销",或者希望能够在运行时可以添加任意属性的动态对象是非常有用的.


Jos*_*eph 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")
Run Code Online (Sandbox Code Playgroud)

印刷输出:

高清

ABC

groovy.lang.MissingPropertyException

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

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

有关更多信息,请参阅Expando API文档.


Sor*_*ter 5

Groovy 对 json 有一个等效的表示法。唯一的区别是它们使用 [:] 代替 {} 来表示地图。因此,您可以清楚地将 json 转换为 groovy 对象表示法。

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

这里我没有直接打印对象。因为它将用方括号表示法打印。

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