Review request for 8001536
Remi Forax
forax at univ-mlv.fr
Wed Oct 31 11:15:16 UTC 2012
On 10/30/2012 07:53 PM, Lance Andersen - Oracle wrote:
> Hi Remi,
>
>
> Thank you for the feedback
>
> On Oct 30, 2012, at 2:05 PM, Remi Forax wrote:
>
>> On 10/30/2012 05:25 PM, Lance Andersen - Oracle wrote:
>>> Hi,
>>>
>>> This is a request for review of http://cr.openjdk.java.net/~lancea/8001536/webrev.00/. This adds read/writeObject as well as clone methods to SerialXLob classes.
>>>
>>> All SQE tests passed, 1 failure in the RowSet JCK/TCK tests due to a bug in the test that the TCK team is aware of and will address. JDBC Unit tests all pass .
>> Hi Lance.
>> In SerialBlob and in SerialClob
>> test (obj == null) is not necessary in equals, null instanceof X is always false.
> OK, thanks for the suggestion, I will make this change
>> in hashCode, Objects.hash() allocate an array to pass arguments to Arrays.hashCode() and box primitive values to Object.
>> while this method is really convenient to use, each calls will allocate an array and box the two values,
>> the overhead seems to high here.
>> This code should be equivalent:
>> return ((31 +Arrays.hashCode(buf)) * 31 +len) * 31 + origLen;
> I can simplify hashCode to the what you have above, I liked the convenience method which is why I was using it. But happy to change it
In fact, thinking a little more about that, Objects.hash() even don't
provide the semantics you want
because it calls Arrays.hashCode() and not Arrays.deepEquals() so
Objects.hash(buf, ..., ....) calls
buf.hashCode() and not Arrays.hashCode(buf).
>> in clone, sb should not be initialized to null
> I think it is OK as I have it as HashMap does it similar to what I have done vs ArrayList which follows your suggestion. Do we have a preferred practice or is this just a style choice?
>> and the catch should be: throw new InternalError(e),
> Given I am providing clone(), I did not see a reason to provide InternalError(). I have no strong preference but some java classes do and others do not (HashMap for example), so what is our preferred standard?
I don't think it's a good idea to let the catch empty and I don't like
to have to initialize a variable
in the code for something that never occurs.
Maybe something like:
A a;
try {
a = clone();
} catch(CloneNotSupportedException e) {
throw null; // should never be executed
}
...
throw null will not produce a big bytecode unlike new InternalError(e)
and because it's a throw, the compiler will not require to initialize 'a'.
And this pattern should be enforced in the whole JDK.
>> this is the standard code you can see in clone.
>>
>> in readObject, the test (buf.length != len) can be done before decoding the blob.
> True, I can move it up.
>> in writeObject, you set "blob" twice, which is weird,
> my bad, I forgot to remove that.
>> also I think that if blob is not Serializable,
>> the code should throw an exception, so you should not use instanceof and let s.writeFields()
>> to throw NotSerializable exception.
> This is intentional. A Blob or Clob will not be serializable as its properties are unique to the database and it is created from an active Connection object.
>
> In the event someone actually tried to serialize this, I do not want it to fail just because someone passed in a LOB to instantiate this beast (note these methods should never have been created this way but this is way before my time).
>
> In the unlikely event someone created their own wrapped Blob/Clob (which I cannot see why anyone would do), I am allowing for both for backwards compatibility.
Ok, maybe you should add a comment.
>
> Best
> Lance
kind regards,
Rémi
More information about the core-libs-dev
mailing list