covariant returns for CharBuffer.subSequence

Martin Buchholz martinrb at google.com
Sat Aug 2 23:05:11 UTC 2008


Hi Buffer Buddies,

My changes for CharSequence are both easier and
less controversial than changes for Buffer.mark,flip,clear.
All one has to do in my proposal is change return types.

For Buffer methods, on the other hand, one has to
copy/paste/modify javadoc from Buffer into its subclasses,
and more importantly, remove the "final" modifier on
Buffer's methods, which is a noticeable incompatibility,
that might perhaps have security or performance implications.
So I am declining the invitation to work on those.
The covariant CharSequence change can stand on its own.

Martin

On Fri, Aug 1, 2008 at 1:39 AM, Alan Bateman <Alan.Bateman at sun.com> wrote:
> Martin Buchholz wrote:
>>
>> We would like to have return types of methods be the most covariant
>> as is reasonable.  The only problem is compatibility.
>> For classes that cannot be subclassed by users,
>> changing covariant returns is almost 100% compatible.
>> (We all know that no change is 100.000000% compatible)
>>
>> The spec for CharBuffer.CharSequence appears to guarantee that
>> the returned object is itself a CharBuffer, so all we need to
>> change is the return type:
>>
>
> Right, buffers are not extensible (no public or protected constructors,
> etc.) so it does seem safe to take advantage of covariant returns.  There
> are a number of other "opportunities" in this package that Iris and I have
> chatted about for jdk7. In particular the Buffer flip/etc. methods come up
> quite often as the more specific return type would facilitate better method
> invocation chaining. Are you interested in doing those too? I ask because
> there are a couple of existing RFEs for this (4774077 is the main one)? If
> not, then we can create a specific bug for subSequence to let you get this
> done.
>
> I see your String updates have a dependency on this. I've only glanced at it
> so far but I assume by moving the casts you can separate this work if
> required.
>
> -Alan.
>
>
>> Hence:
>>
>> diff --git a/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java
>> b/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java
>> --- a/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java
>> +++ b/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java
>> @@ -186,7 +186,7 @@
>>
>>     // --- Methods to support CharSequence ---
>>
>> -    public CharSequence subSequence(int start, int end) {
>> +    public CharBuffer subSequence(int start, int end) {
>>         int pos = position();
>>         int lim = limit();
>>         assert (pos <= lim);
>> diff --git a/src/share/classes/java/nio/Direct-X-Buffer.java
>> b/src/share/classes/java/nio/Direct-X-Buffer.java
>> --- a/src/share/classes/java/nio/Direct-X-Buffer.java
>> +++ b/src/share/classes/java/nio/Direct-X-Buffer.java
>> @@ -391,7 +391,7 @@
>>
>>     // --- Methods to support CharSequence ---
>>
>> -    public CharSequence subSequence(int start, int end) {
>> +    public CharBuffer subSequence(int start, int end) {
>>         int pos = position();
>>         int lim = limit();
>>         assert (pos <= lim);
>> diff --git a/src/share/classes/java/nio/Heap-X-Buffer.java
>> b/src/share/classes/java/nio/Heap-X-Buffer.java
>> --- a/src/share/classes/java/nio/Heap-X-Buffer.java
>> +++ b/src/share/classes/java/nio/Heap-X-Buffer.java
>> @@ -566,7 +566,7 @@
>>
>>     // --- Methods to support CharSequence ---
>>
>> -    public CharSequence subSequence(int start, int end) {
>> +    public CharBuffer subSequence(int start, int end) {
>>         if ((start < 0)
>>             || (end > length())
>>             || (start > end))
>> diff --git a/src/share/classes/java/nio/StringCharBuffer.java
>> b/src/share/classes/java/nio/StringCharBuffer.java
>> --- a/src/share/classes/java/nio/StringCharBuffer.java
>> +++ b/src/share/classes/java/nio/StringCharBuffer.java
>> @@ -99,7 +99,7 @@
>>         return str.toString().substring(start + offset, end + offset);
>>     }
>>
>> -    public final CharSequence subSequence(int start, int end) {
>> +    public final CharBuffer subSequence(int start, int end) {
>>         try {
>>             int pos = position();
>>             return new StringCharBuffer(str, -1,
>> diff --git a/src/share/classes/java/nio/X-Buffer.java
>> b/src/share/classes/java/nio/X-Buffer.java
>> --- a/src/share/classes/java/nio/X-Buffer.java
>> +++ b/src/share/classes/java/nio/X-Buffer.java
>> @@ -1245,7 +1245,7 @@
>>      *          If the preconditions on <tt>start</tt> and <tt>end</tt>
>>      *          do not hold
>>      */
>> -    public abstract CharSequence subSequence(int start, int end);
>> +    public abstract CharBuffer subSequence(int start, int end);
>>
>>
>>     // --- Methods to support Appendable ---
>>
>
>



More information about the core-libs-dev mailing list