假设我们有这样一个类:
class Bar {
boolean b;
}
class Foo {
String zoo;
Bar bar;
}
然后我们有一个扩展 Foo 的类:
class Stew extends Foo {
public Stew(Bar b, String z){
this.bar = b;
this.zoo = z;
}
}
我的问题是 - 是否有任何方法可以防止 Stew
具有任何不在 Foo
中的非方法字段?换句话说,我不希望 Stew
有任何字段,我只希望 Stew
实现构造函数和一两个方法。
也许有一个注释我可以使用,可以做到这一点?
类似于:
@OnlyAddsMethods
class Stew extends Foo {
public Stew(Bar b, String z){
this.bar = b;
this.zoo = z;
}
}
目的 - 我要将 Stew
序列化为 JSON,但我不希望 Stew 有任何新字段。我想让任何处理此文件的开发人员知道任何其他字段都将被忽略(或不会被识别)等。
最佳答案
Java 语言没有提供防止子类添加字段的内置方法。
您可以编写注释处理器(本质上是 java 编译器的插件)来强制执行此类注释,或者使用反射 api 检查父类(super class)构造函数或单元测试中的子类字段声明。前者提供编译时支持,甚至可能提供 IDE 支持,但比后者更难实现。
后者可能看起来像这样:
public class Super {
protected Super() {
for (Class<?> c = getClass(); c != Super.class; c = c.getSuperClass()) {
if (c.getDeclaredFields().length > 0) {
throw new IllegalApiUseException();
}
}
}
}
您可能希望允许静态字段,并添加更好的错误消息。
关于java - 扩展类而不添加任何新字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53403857/