<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;">
Note: the static implementations are there because you can’t default overridden methods. In this case methods inherited from Object.
<div><br id="lineBreakAtBeginningOfMessage">
<div><br>
<blockquote type="cite">
<div>On Mar 19, 2024, at 3:59 PM, Guy Steele <guy.steele@oracle.com> wrote:</div>
<br class="Apple-interchange-newline">
<div>
<div style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;">
<br id="lineBreakAtBeginningOfMessage">
<div><br>
<blockquote type="cite">
<div>On Mar 19, 2024, at 2:33 PM, Brian Goetz <brian.goetz@oracle.com> wrote:</div>
<br class="Apple-interchange-newline">
<div>
<div><span style="white-space: pre-wrap"></span>
<blockquote type="cite" cite="mid:20240319141945.795026959@eggemoggin.niobe.net">
<blockquote type="cite">
<pre class="moz-quote-pre" wrap="">Here I set forth your three examples with new names that are related
to those already used in the existing preview implementation of
StringTemplate in JDK 21 (and JDK 22—I just checked). I do this not to
suggest that these other names should be used, but only in the hopes
of reducing confusion as we begin this discussion. Later we can decide
whether the names “process” and “interpolate” and “combine” should be
changed (possibly all into the same single name).

    // on String
    static String process(StringTemplate)    // previously STR

    // on StringTemplate
    String interpolate()                             // STR, instance/suffix version
    static StringTemplate combine(StringTemplate...) // + for string templates
</pre>
</blockquote>
<pre class="moz-quote-pre" wrap="">Maybe I’m missing something, but: Why do we need both `String::process`
and `StringTemplate::interpolate`?  What are the use cases?
</pre>
</blockquote>
<br>
For a similar reason we currently have String::valueOf(int) and Integer::toString(int).  In some use cases, the "prefix" usage (static method) feels more natural, whereas in others, the "suffix" usage (instance method) feels more natural. 
<br>
<br>
Even if we end up with only one, I would rather not bias towards "of course it is the static version" at this early point; I am trying to sketch out scope right now.<br>
</div>
</div>
</blockquote>
<br>
</div>
<div>Well, we can start by first examining the methods of the StringTemplate interface in JDK 22:</div>
<div><br>
</div>
<div>Factory methods:</div>
<div><font face="Menlo"><span class="Apple-tab-span" style="white-space:pre"></span>static StringTemplate of(String)</font></div>
<div><font face="Menlo"><span class="Apple-tab-span" style="white-space:pre"></span>static StringTemplate of(List<String>, List<?>)</font></div>
<div>Accessors:</div>
<div><font face="Menlo"><span class="Apple-tab-span" style="white-space:pre"></span>List<String> fragments()</font></div>
<div><font face="Menlo"><span class="Apple-tab-span" style="white-space:pre"></span>List<Object> values()</font></div>
<div>Combining:</div>
<div><font face="Menlo">*<span class="Apple-tab-span" style="white-space:pre"> </span>
static StringTemplate combine(StringTemplate... stringTemplates)</font></div>
<div><font face="Menlo"><span class="Apple-tab-span" style="white-space:pre"></span>static StringTemplate combine(List<StringTemplate> stringTemplates)</font></div>
<div>String interpolation:</div>
<div><font face="Menlo">*<span class="Apple-tab-span" style="white-space:pre"> </span>
default String interpolate()</font></div>
<div><font face="Menlo"><span class="Apple-tab-span" style="white-space:pre"></span>static String interpolate(List<String> fragments, List<?> values)</font></div>
<div>Conversion to diagnostic string:</div>
<div><font face="Menlo"><span class="Apple-tab-span" style="white-space:pre"></span>static String toString(StringTemplate stringTemplate)</font></div>
<div>Processing:</div>
<div><font face="Menlo"><span class="Apple-tab-span" style="white-space:pre"></span>default <R, E extends Throwable> R process(StringTemplate.Processor<? extends R,? extends E> processor)</font></div>
<div><br>
</div>
<div>I reckon we still need the factories and accessors.</div>
<div><br>
</div>
<div>As for combining, the first one (indicated by *) is on Brian’s list, and I am not sure the second one is needed, but it is not a big deal to include it, I suppose.</div>
<div><br>
</div>
<div>As for string interpolation, the first one (indicated by *) is on Brian’s list, and I am not sure we need the second, static one: is it not equivalent to `StringTemplate.of(frags, vals).interpolate()`? Is it there just to avoid allocating a StringTemplate,
 or perhaps to support the implementation of the instance method `interpolate()`?</div>
<div><br>
</div>
<div>I am not sure why this static `toString` method is there, rather than relying on the `toString()` instance method that every object must support. Is it present to support the implementation of the instance method? I guess I don’t see why this is not just
 a `default` implementation of the instance method.</div>
<div><br>
</div>
<div>I reckon we don’t need this particular `process` method in a design that does not have the `StringTemplate.Processor` interface.</div>
<div><br>
</div>
<div>So of these ten methods, I guess we surely need 6, don’t need 1, and I am uncertain about 3 for various reasons.</div>
<div><br>
</div>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</body>
</html>