JDK 12 RFR of JDK-8209024: Use SuppressWarnings on serialVersionUID fields in interfaces

joe darcy joe.darcy at oracle.com
Mon Aug 6 23:16:45 UTC 2018


Hi Sergey,

On 8/6/2018 3:39 PM, Sergey Bylokhov wrote:
> Hi, Joe.
>
> On 06/08/2018 14:30, joe darcy wrote:
>> Even if currently less commonly used, I think "ineffectual" better 
>> captures the intention of what I want to convey in the comment than 
>> "ineffective."
>
> Can you please clarify this: what does it mean "ineffectual" in this 
> context? why we need to "suppress" them and why these fields cannot be 
> dropped?
>

A serialVersionUID field is intended to be used to provide the serial 
hash of a class both to avoid the cost of its computation at runtime and 
to provide cross-version serial stability in the face of innocuous 
changes to the class. The serialVersionUID of an interface type is *not* 
used in the serialization machinery. The names of interfaces are used 
however. Therefore, a serialVersionUID field on an interface does not 
have the effect one would assume it has, namely altering the behavior of 
serialization. In that sense, these field declarations in interfaces are 
ineffectual.

I'm working on expanding the checks done by "javac -Xlint:serial", 
including flagging these and other ineffectual serialization coding 
patterns. I've pushed a number of related cleanup fixes earlier in JDK 
12 (JDK-8208060, JDK-8207751, JDK-8208782, etc.). Much of the JDK code 
base is compiled using "-Xlint:all -Werror", meaning that if the set of 
checks is expanded and new warnings are generated, the build will fail. 
While it would be possible to exclude the expanded serial check from the 
build, I'd prefer to address the serial issues instead.

Since the files modified by  JDK-8209024 are pre-JDK 9 interfaces, their 
static serialVersionUID fields are *public* fields, meaning they are 
part of the interfaces' contract. Therefore, the fieldscannot just be 
removed per our usual compatibility policy, unlike, say a private field 
in a class. For that reason, I think it is reasonable to suppress the 
(future) serial warnings for these fields, rather than to remove the 
fields. I wouldn't oppose the effort if someone else wanted to 
deprecated these fields for removal and then remove the fields in a 
future release, but I don't think the cost/benefit of that particular 
route is justified.

HTH,

-Joe



More information about the core-libs-dev mailing list