如何注释从抽象 Class 派生的实例变量?

How to annotate an instance variable derived from an abstract Class?

我有以下摘要Java class:

abstract class AbstractDto {

  String id;

  public void setId(String id) { this.id = id; }    

  public String getId() {return id; }

}

我还有 class 扩展了摘要 class:

class SomeDto extends AbstractDto {

  @SomeAnnotation
  String id;

}

我想注释从抽象派生的实例变量 class。我不确定这是否是我这样做的方式。我知道 Java 不提供变量重载,所以这是阴影。

如果我这样做会发生什么:

public void go(AbstractDto dto) {
  println("dto.id: "+dto.id);
}

AbstractDto dto = new SomeDto();
dto.setId("1234");
go(dto);

由于我在设置 SomeDto 的 ID 时进行了阴影处理,因此有一个 id 从 AbstractDto 继承的变量仍未设置。

如何注释在抽象超类中定义的实例变量class?

编辑:当我这样做时:

SomeDto dto = new SomeDto();
dto.setId("123");

AbstractDto中的id和SomeDto中的id设置的是哪个? 摘要 class 中的一个方法从 id 读取然后使用哪个 id 会发生什么?

您提供的示例称为 shadowing,Java 中的字段没有覆盖。

有关 阴影 的更多信息可以在 Wikipedia:

中找到

In computer programming, variable shadowing occurs when a variable declared within a certain scope (decision block, method, or inner class) has the same name as a variable declared in an outer scope.

因此,要使用您的注释,您可以在摘要 class 中注释您的 id 变量(所有继承的 classes 都可以使用该注释变量),或者只注释SomeDtoid 变量,但你必须知道它是一个新变量(与 id 的超级 class 变量无关)

关于你的第二个问题:

Which id was set the one in AbstractDto or the one in SomeDto?

因为dto的引用变量类型是SomeDto,所以会设置SomeDto的id。为了进一步解释,在继承的 class SomeDto 中,您定义了另一个隐藏第一个变量的 id 变量,因此每次调用都使用对该 class 或任何继承的 [= SomeDto 的 62=] 将调用 SomeDto class 中定义的新 id 变量。

What happens I a method in the Abstract class reads from id which id is then used?

每次调用摘要 class 中的 id 都会使用摘要 class 中的 id,因此在 AbstractDto 中实现的方法并使用变量 id 将使用 AbstractDto 一个。

注解定义在abstract super中的实例变量class:

这是一些现实生活中的例子,其中注释了抽象 classes 的实例变量:

  • Spring, abstract class and annotations
  • Spring and Abstract class - injecting properties in abstract classes