我可以注释从超类继承的成员吗?

时间:2013-06-26 11:53:04

标签: java inheritance annotations

如果我有一个类如:

class Person {
  private String name;
  ...constructor, getters, setters, equals, hashcode, tostring...
}

我可以将子类子类化并应用于子类中的name字段,例如应用持久性注释,而无需重新实现类的其余部分吗?

@Entity
class Employee extends Person {
    @Column(...)
    private String name;
}

4 个答案:

答案 0 :(得分:14)

由于超类中的字段不会受到影响,因此无法正常工作,但您可以尝试这个

@Entity
class Employee extends Person {
  @Column(name="xxx")
  @Override
  public void setName(String name) {
     super.setName(name);
  }
  ...

答案 1 :(得分:9)

不,你不能。

您提议的是字段阴影 - 您无法覆盖字段。

子类中的字段name与超类中的字段name没有任何关系,除了它共享“name”的相同名称,从而区分字段中的字段超类,必须在子类中将其称为super.name

这样做通常被认为是一个“错误”(或者可能是一个潜在的错误),最佳实践是不影响字段,因为在不知情的情况下很容易引用错误的字段。

答案 2 :(得分:1)

迟到的答案,但我认为重写getter方法是一种可靠的方法。

这可以是具有id字段的所有表的超类。如果将此对象序列化为JSON,则始终显示id。

@MappedSuperclass
class ModelEntity {

    @Id
    @Column(
        name      = "id",
        updatable = false,
        nullable  = false
    )
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Long id
}

但是,让我们说你有以下对象(表格)PersonOccupation,其中PersonOccupation有一对多的关系。

@Entity
@Table(name = "occupation")
Occupation extends ModelEntity {

    @Column
    String company

    @Column 
    String position
}

@Entity
@Table(name = "person")
Person extends ModelEntity {

    @Column
    String name

    @OneToMany
    Occupation occupation
}

如果你要序列化ModelEntity对象,那么扩展Person的所有类中都会出现id,你会得到类似的结果:

{
    "id" : 1,
    "name" : "Jordan",

    "occupation" : {
        "id" : 1,
        "company" : "WalMart",
        "position" : "Engineer"
    }

}

如果您不希望ID显示在Occupation对象中,但您确实希望它显示在Person对象中,则可以在getId()方法中实现Occupation方法@Transient public Long getId() { return id; } 班级,并应用所需的注释:

{
    "id" : 1,
    "name" : "Jordan",

    "occupation" : {
        "company" : "WalMart",
        "position" : "Engineer"
    }

}

现在您的JSON将如下所示:即使它们在实际数据库中都有一个id列:

videoView.contentOverlayView?.layer?.setNeedsDisplay()

答案 3 :(得分:0)

不 - 你会得到两个不同的领域。 Employee中带注释的名称字段将隐藏Person类中的名称字段。 Person.name将不会被注释。