classpath
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: serialVersionUID (again)


From: Eric Blake
Subject: Re: serialVersionUID (again)
Date: Fri, 11 Oct 2002 22:48:29 -0600
User-agent: Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.0.1) Gecko/20020823 Netscape/7.0

Your summary seemed good to me.

Mark Wielaard wrote:
What I don't understand is why it is so hard to specify the actual
accessor methods. Does anybody know why they were never clearly
specified?

Partly because it was a hack added in JDK 1.1. To maintain the most possible backward compatibility with 1.0, the whitepaper spec for adding inner classes gave recommendations for things like this$0 for the enclosing class, Outerclass$<num> for anonymous classes, class$(String) as the method to compute class literals, access$<num>() for accessors, and val$i for accessing a final local variable in a local class. But none of these were set in stone, in an attempt to avoid polluting the user's namespace. Only one naming scheme was required, rather than recommended - and that was that member classes (such as Outer.Inner) be given the name Outer$Inner, because it affects how a compiler finds inner classes when referenced from other .java files. Likewise, the specification requires that non-private constructors of non-static member classes have an additional first parameter for the enclosing class (but parameter names are not specified). All other compiler-generated names are local to a .java file, so the name chosen really doesn't matter.

In the 2nd edition JLS, this scheme was maintained - chapter 13 of the JLS specifies ONLY the naming scheme of member classes, and leaves everything else to the compiler. It is up to the compiler to avoid name clashes with the user's code, and JLS2 does not prohibit a user from naming things in his class with names that would clash with the whitepaper suggested names.

(In my opinion, the choice of keeping '$' as a legal user identifier character is deplorable - if Sun had truly wanted to keep compiler names and user names separate, they should have given the compiler a unique character or namespace for naming synthetic constructs).


If both Tom Tromey and Eric Blake say that although theoretical
possible, it is too difficult for us to ensure compatibility in the free
compilers with the proprietary Sun javac naming scheme and other
synthetic stuff I think that are current policy (always add
serialVersionUID if the class is Serializable) is a good one.

What do others think? Should we try to reverse engineer the naming
scheme? Or do we keep the current policy? Or we could even ignore being
serializable compatible with the Sun JDK till this is clearly specified.

I don't think it ever will be clearly specified what accessor methods must be named - I think it is up to the compiler to choose its naming scheme.

And, if I am correct about compiling the Foo.class literal, jikes will never compile serial versions compatibly with javac, because jikes relies on class$(String, boolean) to avoid initializing the class, whereas javac is still using class$(String) and incorrectly initializing classes when evaluating the .class literal.

So I am okay with the proposal to always add a serialVersionUID to all Classpath files (with libgcj, I'm not as sure that it is necessary, except for the hassle of maintaining two sources). But I may be a bit biased, so I look forward to other's views on the matter.

--
This signature intentionally left boring.

Eric Blake             address@hidden
  BYU student, free software programmer






reply via email to

[Prev in Thread] Current Thread [Next in Thread]