2013-06-26 4 views
4

Если у меня есть класс, такие как:Можно ли аннотировать элемент, унаследованный от суперкласса?

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

Могу ли я подкласс и применить аннотации к полю имени в подклассе, например, применять сохраняемости аннотаций, без повторного внедрения остальной части класса?

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

Вы можете переопределить геттер/сеттер и поместить там '@ Column'. – maba

ответ

8

Нет, вы не можете.

То, что вы предлагаете, является полем shadowing - вы не можете переопределить поле.

В этом подклассе name не имеет ничего общего с полем name в суперклассе, кроме того, что оно имеет одно и то же имя «имя» и, таким образом, чтобы отличить поле в суперклассе, нужно обратиться к это как super.name в подклассе.

Выполнение этого обычно считается «ошибкой» (или потенциальной ошибкой в ​​любом случае), а лучшие практики - не теневые поля, потому что так легко обращаться к неправильному полю, не зная об этом.

8

Это не будет работать, так как поля в суперкласс не будут затронуты, но вы можете попробовать это

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

Также работает, и я бы сказал, был более ясен, для переопределенных ('@ Override') методов getter. – Raedwald

0

Нет - вы получите два разных поля. Аннотированное поле имени в Employee будет скрывать поле имени в классе Person. Person.name не будет аннотирован.