Re: Thread safety, "array of singletons".
On Mar 25, 2:58 pm, Tom Hawtin <use...@tackline.plus.com> wrote:
Daniel Pitts wrote:
I have a "Card" class which has objects that represent cards out of a
standard poker deck. I statically initialize the array.
My basic question is: Are there circumstances in which the following
code will not produce "==" comparable Card objects? These objects may
be passed through RMI or otherwise serialized.
I believe, malicious code could grab a deserialised instance before
readResolve, but other than that I think you have covered all the bases.
I'm not worried about malicious code in this place. the value only
"really" matters on a server side, which shouldn't load or execute
untrusted code at all. But out of curiosity, how WOULD malicious code
obtain a pre-readResolved reference? It doesn't matter in this case,
but if its possible, I should learn about it :-)
import java.io.InvalidObjectException;
import java.io.ObjectStreamException;
public final class Card {
static final long serialVersionUID = 1L;
You mean:
public final class Card implements java.io.Serializable {
private static final long serialVersionUID = 1L;
Yes I did.
public final transient Suit suit;
public final transient String number;
public final transient int value;
I would calculate these on demand.
Perhaps, but I'm avoiding getters here, and there seems little reason
to not pre-calculate these values.
protected final Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
The class is final, so why bother?
Why bother? Just in case :-) Defensive programmming...
Having it declared this way lets future developers know it should not
be changed. This is actually noted in a comment that I stripped out.
It is also stolen from java.lang.Enum;
protected final Object readResolve() throws ObjectStreamException {
Why protected?
Well, my IDE complains about unused private methods, and public seems
a bad idea, as well as package-protected.
Anyway, other than malicious readResolve interceptors, this looks like
it would be safe and correct code?
Thanks,
Daniel.