代码之家  ›  专栏  ›  技术社区  ›  NaN

我能“重写”超类私有字段的注释吗?

  •  1
  • NaN  · 技术社区  · 6 年前

    在其他编程语言领域工作了20年,现在我对Java还是个新手,感觉自己像个傻瓜程序员。。。

    我用的是 Indexable @entity 所以我不需要把 @Id @GeneratedValue @SequenceGenerator 所有的人。我也有 Auditable @CreatedBy @CreatedDate @ModifiedBy @ModifiedDate 这会导致继承路径:

    • SomeEntityClass>IndexableClass。

    现在我注意到99%的实体类也有:

    @Column(nullable = false, unique = true) private String name;
    

    我想把那条线移到 可转位 类来避免在这99%中出现样板代码,但是这两个类没有 名称 领域很重要 可审计 类,我不想仅仅复制所有的祖先字段到它们,只是为了防止出现空名称的错误。

    问题是: 如果我重写了这两个类上的字段注释,使其可以为null并且是暂时的,那么可以避免在表上创建这个字段,也不会用空名称困扰用户吗?

    class SomeAuditableClass extends Audited {
      //@override
      @Column(nullable = true) @Transient private String name;
    

    Is there a way to override class variables in Java? 帮不了什么忙。。。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Bernie    6 年前

    Indexable 比如说,另一个班, IndexableWithName name 场会延伸 IndexableWithName ,而没有 名称 会直接延伸 可转位 .

    我不能不尝试一下就数据库映射而言,您的建议是否有效。但我认为这将是一个糟糕的类设计,因为你可能会有一个getter和一个setter 名称 字段在超类中,它们在两个没有 字段。

        2
  •  2
  •   Stephen C    6 年前

    不,您不能覆盖它们:

    • 父类的私有字段在子类中不可访问

    在运行时,可以使用反射来破坏抽象,以查看超类私有字段的注释。但不能添加或删除它们:请参见 Adding Java Annotations at Runtime . 即使可以,运行时也可能太迟了。

    但对于您的用例来说,这似乎是一个非常糟糕的主意。您不想创建和维护一个私有的Hibernate分支(比如说)具有非标准功能的Hibernate,只是为了在样板代码上节省相对较少的资源。