Is it possible to create object without declaring class?

Groovy

Groovy Problem Overview


Is it possible to create object without declaring class? Like in JavaScript obj = {a: '1'}; console.log(obj.a)

Groovy Solutions


Solution 1 - Groovy

In Groovy you must always provide the class of an object being created, so there is no equivalent in Groovy to JavaScript's object-literal syntax.

However, Groovy does have a literal syntax for a Map, which is conceptually very similar to a JavaScript object, i.e. both are a collection of properties or name-value pairs.

The equivalent Groovy code to the JavaScript above is:

def obj = [a: '1']
println obj.a

Even though there is no class name used here you're still creating an object of a particular class (java.util.LinkedHashMap). The code above is just shorthand for:

def obj = new LinkedHashMap();
obj.a = '1'
println obj.a

The Expando class is perhaps even more similar to a JavaScript object, and is useful when you want to avoid the "overhead" of defining a class, or want a dynamic object to which any arbitrary property can be added at runtime.

Solution 2 - Groovy

Slightly surprised that nobody has mentioned the Expando class. This adds extra functionality over a map in that you can directly reference properties within your functions. Code example below.

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")

printed output:

def

ABC

groovy.lang.MissingPropertyException

ABC (if you comment out the println($a) in the map.run, println($b) prints out ABC)

Ignore the extra line breaks in the output. Was having a heck of a time putting def and ABC on consecutive lines.

See the Expando API documentation for more information.

Solution 3 - Groovy

Groovy has an equivalent notation for json. Only difference is they use [:] for maps instead of {}. So you can clearly convert a json into a groovy object notation.

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)

Here I have not printed the object directly. Since it will print with square braces notation.

Read the whole article. Groovy for javascript developers. https://metamug.com/article/groovy-for-javascript-developers.php

Solution 4 - Groovy

You can use a literal map:

config = [
        host    : '0.0.0.0',
        user    : 'user1',
        password: 'pass'
]

println("""
HOST: ${config.host}
USER: ${config.user}
PASS: ${config.password}
""")

> You can also return a literal map as a function return value without having to define a custom class e.g. return [status: 200, body: 'abcdef'] and then in the caller access the values e.g. with response.status.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionfedor.belovView Question on Stackoverflow
Solution 1 - GroovyDónalView Answer on Stackoverflow
Solution 2 - GroovyJosephView Answer on Stackoverflow
Solution 3 - GroovySorterView Answer on Stackoverflow
Solution 4 - GroovyccpizzaView Answer on Stackoverflow