java - 扩展类而不添加任何新字段

标签 java json serialization java-8

假设我们有这样一个类:

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/

相关文章:

Java: float[][] 点

c# - 如何使用 json.net 将 json 数组添加到 JObject 的属性中

c# - XmlSerializer.Serialize异常: "The type [type] was not expected."

java - 动态主机页的 GWT RPC 序列化

java - android中的main或UI线程在哪里准备弯针?

Java TCP 服务器一次发送更多消息

android - Google Books api 未提供输出

json - Ajax JSON 解析错误

java - 如何在java的rest调用中将Map作为requestBody发送

java - 如何分离dto映射逻辑