Java单元测试匿名内部类写法及serialVersionUID未使用问题咨询
问题解答
一、匿名内部类写法的原理
new Subject() {} 是创建了 Subject的匿名子类 实例:
- 这个匿名子类继承自Subject,因此可以向上转型赋值给Subject类型变量
s1 - 给该匿名子类定义
serialVersionUID,是为了在子类被序列化/反序列化时,使用指定的标识ID,避免JVM自动生成UID引发的序列化兼容性问题(比如类结构微小改动就导致反序列化失败)
二、未使用错误提示的原因
IDE提示“The value of field new Subject(){}.serialVersionUID is not used”,核心原因如下:
- 代码中的匿名子类实例未执行序列化操作:当前仅将其传入
fill方法,操作的是Subject父类的属性,整个流程没有触发序列化逻辑 - 从给出的Subject类代码看,它并未实现
Serializable接口——父类不支持序列化的话,子类的serialVersionUID完全没有生效场景,因此被IDE判定为未使用
三、能否通过getter获取这个serialVersionUID?
不能,原因有两点:
serialVersionUID是private static final修饰的:private权限限制了只能在匿名子类内部访问,外部(包括父类Subject)无法直接调用;且static成员属于类本身,不属于实例,用实例级的getter方法获取类级成员本身不符合逻辑- 匿名内部类没有类名,无法通过常规语法引用其静态成员,即便用反射实现也属于非常规操作,不推荐使用
内容的提问来源于stack exchange,提问作者Ignas Davulis
相关产品推荐
相关产品推荐

