<div dir="ltr">Thanks Markus, let's continue the API discussion here.<div><br></div><div>I indeed believe that allowing to batch-copy to an array is a good idea.  The JDK CharSequence can provide a safe "ranged copy from source into destination" functionality.  However, users must be aware that there may be malicious CharSequence implementations that may retain references to the passed array; users must copy the resulting array again if they store it.</div><div><br></div><div>This particular fact is fine for Reader.of, since arbitrary readers should never be trusted.  However, I think this might affect many other usages of getChars if users pass in a trusted char array into such a method.</div><div><br></div><div>-Chen</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Oct 27, 2024 at 3:44 AM Markus Karg <<a href="mailto:markus@headcrashing.eu">markus@headcrashing.eu</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="msg3549445751131818730"><div lang="DE"><div class="m_3549445751131818730WordSection1"><p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New"">>Hi Markus,<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New"">>Should we drop the srcBigin/srcEnd parameters, as they can be replaced by a subSequence(srcBegin, srcEnd) call?<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:12pt;font-family:"Times New Roman","serif"">Chen, I do understand your idea and while originally I had the same in mind (it really <i>is</i> appealing!), I came up with a draft using the <b>original</b> </span><span style="font-size:10pt;font-family:"Courier New"">String.getChars()</span><span style="font-size:12pt;font-family:"Times New Roman","serif""> signature instead, due to the following drawbacks:<u></u><u></u></span></p><ul type="disc"><li class="MsoNormal"><span style="font-size:12pt;font-family:"Times New Roman","serif"">There might exist (possibly lotsof) </span><span style="font-size:10pt;font-family:"Courier New"">CharSequence.getChars(int, int, char[], int)</span><span style="font-size:12pt;font-family:"Times New Roman","serif""> implementations already, as this problem (and the idea how to solve it) is anything but new. At least such implementations are </span><span style="font-size:10pt;font-family:"Courier New"">String</span><span style="font-size:12pt;font-family:"Times New Roman","serif"">, </span><span style="font-size:10pt;font-family:"Courier New"">StringBuilder</span><span style="font-size:12pt;font-family:"Times New Roman","serif""> and </span><span style="font-size:10pt;font-family:"Courier New"">StringBuffer</span><span style="font-size:12pt;font-family:"Times New Roman","serif"">. If we come up with a different signature, then <b>none</b> of these already existing performance boosters will get used by </span><span style="font-size:10pt;font-family:"Courier New"">Reader.of(CharSequence)</span><span style="font-size:12pt;font-family:"Times New Roman","serif""> automatically - at least until they come up with alias methods. Effectively this leads to (possibly lots) of alias methods. At least it leads to alias methods in </span><span style="font-size:10pt;font-family:"Courier New"">String</span><span style="font-size:12pt;font-family:"Times New Roman","serif"">, </span><span style="font-size:10pt;font-family:"Courier New"">StringBuilder</span><span style="font-size:12pt;font-family:"Times New Roman","serif"">, </span><span style="font-size:10pt;font-family:"Courier New"">StringBuffer</span><span style="font-size:12pt;font-family:"Times New Roman","serif""> and </span><span style="font-size:10pt;font-family:"Courier New"">CharBuffer</span><span style="font-size:12pt;font-family:"Times New Roman","serif"">. In contrast, when keeping the signature copied from </span><span style="font-size:10pt;font-family:"Courier New"">String.getChars</span><span style="font-size:12pt;font-family:"Times New Roman","serif"">, chances are good that (possibly lots of) implementations will <i>instantly</i> be supported by </span><span style="font-size:10pt;font-family:"Courier New"">Reader.of(CharSequence)</span><span style="font-size:12pt;font-family:"Times New Roman","serif""> without alias methods. At least, </span><span style="font-size:10pt;font-family:"Courier New"">String</span><span style="font-size:12pt;font-family:"Times New Roman","serif"">, </span><span style="font-size:10pt;font-family:"Courier New"">StringBuilder</span><span style="font-size:12pt;font-family:"Times New Roman","serif""> and </span><span style="font-size:10pt;font-family:"Courier New"">StringBuffer</span><span style="font-size:12pt;font-family:"Times New Roman","serif""> will be.<u></u><u></u></span></li><li class="MsoNormal"><span style="font-size:12pt;font-family:"Times New Roman","serif"">Since decades people are now very used to </span><span style="font-size:10pt;font-family:"Courier New"">StringBuilder.getChars(int, int, char[], int)</span><span style="font-size:12pt;font-family:"Times New Roman","serif"">, so (possibly a lot of) people might simply <i>expect</i> us to come up with that lengthy signature. These people might be rather confused (if not to say frustrated) when we now force them to write an intermediate </span><span style="font-size:10pt;font-family:"Courier New"">subSequence(int, int)</span><span style="font-size:12pt;font-family:"Times New Roman","serif""> for something that was "such simple" before.<u></u><u></u></span></li><li class="MsoNormal"><span style="font-size:12pt;font-family:"Times New Roman","serif"">Custom implementations of </span><span style="font-size:10pt;font-family:"Courier New"">CharSequence.subSequence</span><span style="font-size:12pt;font-family:"Times New Roman","serif""> could come up with the (performance-wise "bad") idea of creating <b>copies</b> instead of views. At least it seems like </span><span style="font-size:10pt;font-family:"Courier New"">AbstractStringBuilder</span><span style="font-size:12pt;font-family:"Times New Roman","serif""> is doing that, so chances are "good" that custom libs will do that, too. For example, because they need it for safety. Or possibly, because they have a technical reason that <i>enforces</i> a copy. That would (possibly massively, depending on the actual class) spoil the idea of performance-boosting this RFC is all about.<u></u><u></u></span></li></ul><p class="MsoNormal"><span style="color:rgb(31,73,125)">-Markus<u></u><u></u></span></p></div></div></div></blockquote></div>