<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
Pushed change:
<div class=""><br class="">
</div>
<pre style="background-color: rgb(255, 255, 255); font-family: "JetBrains Mono", monospace; font-size: 9.8pt;" class=""><span style="color:#808080;font-style:italic;" class="">/**<br class=""></span><span style="color:#808080;font-style:italic;" class=""> * Returns a {</span><span style="color:#808080;font-weight:bold;font-style:italic;" class="">@link </span><span style="color:#808080;font-style:italic;" class="">TemplatedString} based on the current state of the<br class=""></span><span style="color:#808080;font-style:italic;" class=""> * {</span><span style="color:#808080;font-weight:bold;font-style:italic;" class="">@link </span><span style="color:#808080;font-style:italic;" class="">TemplateBuilder Builder's} fragments and values.<br class=""></span><span style="color:#808080;font-style:italic;" class=""> *<br class=""></span><span style="color:#808080;font-style:italic;" class=""> * </span><span style="color:#808080;font-weight:bold;font-style:italic;" class="">@return </span><span style="color:#808080;font-style:italic;" class="">a new TemplatedString<br class=""></span><span style="color:#808080;font-style:italic;" class=""> */<br class=""></span><span style="color:#000080;font-weight:bold;" class="">public </span>TemplatedString build() {<br class="">    <span style="color:#000080;font-weight:bold;" class="">return </span>TemplatedString.<span style="font-style:italic;" class="">of</span>(<span style="color:#660e7a;font-weight:bold;" class="">fragments</span>, <span style="color:#660e7a;font-weight:bold;" class="">values</span>);<br class="">}<br class=""></pre>
<div class=""><br class="">
</div>
<div class=""> 
<div class=""><br class="">
</div>
<div class=""><br class="">
</div>
<div class=""><br class="">
<div><br class="">
<blockquote type="cite" class="">
<div class="">On Sep 20, 2022, at 11:13 PM, Jim Laskey <<a href="mailto:james.laskey@oracle.com" class="">james.laskey@oracle.com</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div dir="auto" class="">Thank you for reporting. I’ll check into this. 
<div class=""><br class="">
</div>
<div class="">Cheers,</div>
<div class=""><br class="">
</div>
<div class="">— Jim</div>
<div class=""><br class="">
<br class="">
<div dir="ltr" class="">📱</div>
<div dir="ltr" class=""><br class="">
<blockquote type="cite" class="">On Sep 20, 2022, at 10:58 PM, Nathan Walker <<a href="mailto:nathan.h.walker@gmail.com" class="">nathan.h.walker@gmail.com</a>> wrote:<br class="">
<br class="">
</blockquote>
</div>
<blockquote type="cite" class="">
<div dir="ltr" class="">
<div dir="ltr" class=""><font face="monospace" class="">Hey folks,</font>
<div class=""><font face="monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace" class="">I was poking around at the source in the templated-string branch and saw something that seemed odd.</font></div>
<div class=""><font face="monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace" class="">In the TemplatedString.TemplateBuilder.build() method there is:</font></div>
<div class=""><font face="monospace" class=""><br class="">
</font></div>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px" class="">
<div class=""><font face="monospace" class="">/**</font></div>
<div class=""><font face="monospace" class=""> * Returns a {@link TemplatedString} based on the current state of the</font></div>
<div class=""><font face="monospace" class=""> * {@link TemplateBuilder Builder's} fragments and values.</font></div>
<div class=""><font face="monospace" class=""> *</font></div>
<div class=""><font face="monospace" class=""> * @return a new TemplatedString</font></div>
<div class=""><font face="monospace" class=""> */</font></div>
<div class=""><font face="monospace" class="">public TemplatedString build() {</font></div>
</blockquote>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px" class="">
<blockquote style="margin:0 0 0 40px;border:none;padding:0px" class="">
<div class=""><font face="monospace" class="">return new SimpleTemplatedString(Collections.unmodifiableList(fragments), </font><span style="font-family:monospace" class="">Collections.unmodifiableList(values));</span></div>
</blockquote>
</blockquote>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px" class="">
<div class=""><font face="monospace" class="">}</font></div>
</blockquote>
<div class=""><font face="monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace" class="">And SimpleTemplatedString is just:</font></div>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px" class="">
<div class=""><font face="monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace" class="">record SimpleTemplatedString(List<String> fragments, List<Object> values</font><font face="monospace" class="">) implements TemplatedString {}</font></div>
</blockquote>
<div class=""><font face="monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace" class="">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 class=""><font face="monospace" class=""><br class="">
</font></div>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px" class="">
<div class=""><font face="monospace" class="">var builder = TemplatedString.builder();<br class="">
</font></div>
<div class=""><font face="monospace" class="">TemplatedString ts = builder</font></div>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px" class="">
<div class=""><font face="monospace" class="">.fragment("a:").value(1)</font></div>
</blockquote>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px" class="">
<div class=""><font face="monospace" class="">.fragment(", b:").value(2)</font></div>
</blockquote>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px" class="">
<div class=""><font face="monospace" class="">.build();</font></div>
</blockquote>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px" class="">
<div class=""><font face="monospace" class=""><br class="">
</font></div>
</blockquote>
<font face="monospace" class="">String result = STR.apply(ts); // result = "a:1, b:2"</font></blockquote>
<font face="monospace" class=""><br class="">
</font>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px" class="">
<div class=""><font face="monospace" class="">builder.fragment(", c:").value(3);</font></div>
<div class="">
<div class="">
<div class=""><font face="monospace" class="">result = STR.apply(ts); // result = "a:1, b:2, c:3" - same TempaltedString, very different result</font></div>
</div>
</div>
<div class=""><font face="monospace" class=""><br class="">
</font></div>
</blockquote>
<font face="monospace" class="">Is this behavior intended? Based on the documentation on TemplatedString I wouldn't have thought so, but perhaps I am missing something.</font>
<div class=""><font face="monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace" class="">Thanks for your time.</font></div>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</blockquote>
</div>
<br class="">
</div>
</div>
</body>
</html>