Можно ли создать объект без объявления класса? Как в JavaScript
obj = {a: '1'}; console.log(obj.a)
Можно ли создать объект без объявления класса?
Ответ 1
В Groovy вы всегда должны предоставлять класс создаваемого объекта, поэтому в синтаксисе объекта-литерала JavaScript нет эквивалента в Groovy.
Однако Groovy имеет литеральный синтаксис для Map
, который концептуально очень похож на объект JavaScript, т.е. оба представляют собой набор свойств или пар имя-значение.
Эквивалентный код Groovy для приведенного выше JavaScript:
def obj = [a: '1']
println obj.a
Даже если имя класса не используется здесь, вы все равно создаете объект определенного класса (java.util.LinkedHashMap
). Вышеприведенный код просто сокращен для:
def obj = new LinkedHashMap();
obj.a = '1'
println obj.a
Expando
class, возможно, даже больше похож на объект JavaScript, и полезен, когда вы хотите избежать "накладных расходов" определение класса или динамический объект, к которому любое произвольное свойство может быть добавлено во время выполнения.
Ответ 2
Чуть удивился, что никто не упомянул класс 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")
печатный вывод:
Защита
ABC
groovy.lang.MissingPropertyException
ABC (если вы закомментируете println ($ a) в map.run, println ($ b) выводит ABC)
Игнорировать дополнительные прерывания строки на выходе. Было чертовски время, накладывая def и ABC на последовательные строки.
edit: ссылка Api