Groovy на самом деле делает не податливости вы «Map-Constructor». Конструкторы в вашем классе - это то, что вы записываете. Если их нет (например, в вашем случае), , тогда есть c'tor по умолчанию.
Но что произойдет, если вы используете так называемую карту c'tor (точнее, назовите ее «строительство объекта по карте»)? Общий подход Groovy, как это:
- создать новый объект, используя c'tor по умолчанию (это является причиной, почему строительно-на-карты больше не работает, если бы только, например,
SomeClass(Long id, String name)
)
- затем используйте переданную карту и примените все значения к свойствам.
Если вы disassmble кода (с @CompileDynamic
(по умолчанию)) вы видите, что строительство обрабатываемого CallSite.callConstructor(Object,Object)
, , которая сводится к этому этим code area.
Теперь принесите в версии этой конструкции по карте, что более привычно для регулярного groovyist: SomeClass someClass3 = new SomeClass(id: 42L, name: "Douglas")
.
С динамической версией кода разборки этого на самом деле выглядят , как ваш код с картой. Groovy создает карту из param (s), а отправляет ее на callConstructor
- так что это фактически тот же путь кода, что и (минус создание неявной карты).
Пока игнорировать «литую-дело», так как это фактически то же самое как для статического и динамического : он будет отправлен ScriptBytecodeAdapter.asType
, который в основном дает динамическое поведение в любом случае.
В настоящее время @CompileStatic
кейс: Как вы стали свидетелем, ваш звонок с явной картой для c'tor больше не работает. Это связано с тем, что никогда не было явного «map-c'tor» в первую очередь. Класс еще только имеет свой по умолчанию c'tor и со статической компиляцией groovyc
теперь может просто работать с вещами, которые есть (или нет, если в этом случае нет).
Как насчет new SomeClass(id: 42L, name: "Douglas")
? Это все еще работает со статической компиляцией! Причиной этого является то, что groovyc
разворачивает этот для вас. Как вы можете видеть, это просто сводится к def o = new SomeClass(); o.setId(42); o.setName('Douglas')
:
new #2 // class SomeClass
dup
invokespecial #53 // Method "<init>":()V
astore_2
ldc2_w #54 // long 42l
dup2
lstore_3
aload_2
lload_3
invokestatic #45 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
invokevirtual #59 // Method setId:(Ljava/lang/Long;)V
aconst_null
pop
pop2
ldc #61 // String Douglas
dup
astore 5
aload_2
aload 5
invokevirtual #65 // Method setName:(Ljava/lang/String;)V