Глубокая копия атрибута string-template3?

Я очень новичок в stringtemplate и экспериментировал с ним для проекта языкового перевода.

В любом случае, я определил групповой файл Java, содержащий следующий шаблон:

instantiation(realization, arguments) ::= 
<<new <realization>(<arguments; separator = ", ">)>>

Однако я борюсь со следующим примером:

private StringTemplate myCurTemplate;

public void foo() {
    myCurTemplate = myGroups.getInstanceOf("instantiation");
    myCurTemplate.setAttribute("realization", "test");
    myCurTemplate.setAttribute("arguments", "p0");
    myCurTemplate.setAttribute("arguments", "p1");

    System.out.println("Starting: " + myCurTemplate);  // "new test(p0, p1)"
}

public void bar() {
    StringTemplate modified = myGroups.getInstanceOf("instantiation");
    modified.setAttribute("realization", "anotherTest");
    modified.setAttribute("arguments", myCurTemplate.getAttribute("arguments"));

    System.out.println("Modified: " + modified);  // "new anotherTest(p0, p1)"

    modified.setAttribute("arguments", "p2");
    System.out.println("Modified: " + modified);  // as expected, "new anotherTest(p0, p1, p2)"
    System.out.println("Original: " + myCurTemplate); // "new test(p0, p1, p2)"
}

Обратите внимание, что после добавления "p2" в шаблон "modified" он также изменяет "myCurTemplate"... Может быть, я неправильно спроектировал шаблон (или неадекватно?), но есть ли способ сделать это, не изменяя шаблон? оригинальный "myCurTemplate"??

То есть, могу ли я каким-то образом сделать реальную копию атрибута «аргументы» myCurTemplate без его изменения будущими дополнениями к другим экземплярам шаблона? Я просмотрел методы и API-документацию без особой удачи - у меня такое чувство, что я просто пытаюсь сделать что-то, что обычно не делается или требуется с помощью stringtemplate..

Редактировать: Я еще немного повозился с этим в ST4 и придумал такой код:

ST x = myGroups.getInstanceOf("instantiation");
x.add("realization", "Realiz");
x.add("arguments", "p0");
x.add("arguments", "p1");

ST y = new ST(x);
y.remove("realization"); 
y.add("realization", "Another");
y.add("arguments", "p6");

print x.render(); // "new Realiz(p0, p1, p6)"
print y.render(); // "new Another(p0, p1, p6)"   

Я могу без проблем изменить «атрибут реализации», но по-прежнему сталкиваюсь с проблемами со списками аргументов длины > 1. Например, если бы я определил список аргументов в x как единственный элемент, то изменение его в y сохраняет оба отдельных элемента -- по желанию (может быть, потому что они оба получают отдельную ссылку во время копирования??) Например:

ST x = myGroups.getInstanceOf("instantiation");
x.add("realization", "Realiz");
x.add("arguments", "p0");

ST y = new ST(x);
y.remove("realization"); 
y.add("realization", "Another");
y.add("arguments", "p6");
y.add("arguments", "p3");

print x.render();  // "new Realiz(p0)"
print y.render();  // "new Realiz(p0, p6, p3)"   (like I would expect)

person dtwelch    schedule 22.12.2013    source источник


Ответы (1)


(Под текущим я предполагаю, что вы имеете в виду myCurTemplate). Хм... кажется, я не делаю копию в getAttribute() и не предупреждаю вас не изменять. Итак... не изменяйте его. ;) Он вытаскивает резервный список из myCurTemplate и засовывает в модифицированный. Сначала клонируйте эти элементы.

person Terence Parr    schedule 22.12.2013
comment
Итак, в bar() прямо перед тем, как я попытаюсь назначить аргументы из myCurTemplate измененным, я должен каким-то образом клонировать объект? Я попытался назначить его новому объекту, но оба они все еще изменяются. Я действительно бился головой о стену, пытаясь аккуратно получить эти аргументы. toString() делает свое дело, но он заключает раздражающие квадратные скобки [, ] вокруг напечатанного списка - это просто кажется грязным. - person dtwelch; 23.12.2013
comment
Итак, я думаю, что я действительно спрашиваю, как мне клонировать эти элементы? Вы имеете в виду .clone() Java? - person dtwelch; 23.12.2013
comment
стандартный список копий Java. - person Terence Parr; 24.12.2013