<div dir="ltr"><font face="monospace">Hey folks,</font><div><font face="monospace"><br></font></div><div><font face="monospace">I was poking around at the source in the templated-string branch and saw something that seemed odd.</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">In the TemplatedString.TemplateBuilder.build() method there is:</font></div><div><font face="monospace"><br></font></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><font face="monospace">/**</font></div><div><font face="monospace"> * Returns a {@link TemplatedString} based on the current state of the</font></div><div><font face="monospace"> * {@link TemplateBuilder Builder's} fragments and values.</font></div><div><font face="monospace"> *</font></div><div><font face="monospace"> * @return a new TemplatedString</font></div><div><font face="monospace"> */</font></div><div><font face="monospace">public TemplatedString build() {</font></div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><font face="monospace">return new SimpleTemplatedString(Collections.unmodifiableList(fragments), </font><span style="font-family:monospace">Collections.unmodifiableList(values));</span></div></blockquote></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><font face="monospace">}</font></div></blockquote><div><font face="monospace"><br></font></div><div><font face="monospace">And SimpleTemplatedString is just:</font></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><font face="monospace"><br></font></div><div><font face="monospace">record SimpleTemplatedString(List<String> fragments, List<Object> values</font><font face="monospace">) implements TemplatedString {}</font></div></blockquote><div><font face="monospace"><br></font></div><div><font face="monospace">There doesn't seem to be any defensive copying of the fragments and values lists, just wrapping in the unmodifiableList() call.  So it is unmodifiable but if a builder is reused I then I believe those lists could change.</font></div><div><font face="monospace"><br></font></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><font face="monospace">var builder = TemplatedString.builder();<br></font></div><div><font face="monospace">TemplatedString ts = builder</font></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><font face="monospace">.fragment("a:").value(1)</font></div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><font face="monospace">.fragment(", b:").value(2)</font></div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><font face="monospace">.build();</font></div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><font face="monospace"><br></font></div></blockquote><font face="monospace">String result = STR.apply(ts); // result = "a:1, b:2"</font></blockquote><font face="monospace"><br></font><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><font face="monospace">builder.fragment(", c:").value(3);</font></div><div><div><div><font face="monospace">result = STR.apply(ts); // result = "a:1, b:2, c:3" - same TempaltedString, very different result</font></div></div></div><div><font face="monospace"><br></font></div></blockquote><font face="monospace">Is this behavior intended? Based on the documentation on TemplatedString I wouldn't have thought so, but perhaps I am missing something.</font><div><font face="monospace"><br></font></div><div><font face="monospace">Thanks for your time.</font></div></div>