注释:方法与变量

时间:2010-05-19 20:24:43

标签: java hibernate jpa java-ee

我总是确定(不知道为什么)最好为变量添加注释,但在浏览Hibernate doc http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-hibspec-collection时,我注意到它们倾向于注释方法。所以我应该在方法之前加注我的注释,如下:

@Entity
public class Flight implements Serializable {
private long id;

@Id @GeneratedValue
public long getId() { return id; }

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

或者这样做更好:

@Entity
public class Flight implements Serializable {
@Id @GeneratedValue
private long id;

public long getId() { return id; }

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

或者也许没有区别?

6 个答案:

答案 0 :(得分:3)

正如Péter指出的那样,你需要选择一种风格并坚持使用它,因为@Id注释采用的风格将用于所有事物。

除此之外,这只是品味问题。这两个选项都有效,所以选择你喜欢的选项。有些人更喜欢Hibernate通过方法注入,以便他们可以根据需要巧妙地改变实现。我更喜欢通过字段注入,因为我发现通过getter / setter方法(7行对1行)暴露所有属性很麻烦,当它们在99.9%的时间内它们将作为简单变量工作时(在任何情况下)如果/当我需要编写自定义setter功能时,我可以切换注释样式。)

两者之间没有任何性能或功能差异,因此请选择您喜欢的(或者更重要的是,无论您的团队/工具更喜欢哪种方式)。

答案 1 :(得分:2)

使用@Id注释,有一个区别:如果它在getter上,Hibernate尝试通过常规getter / setter获取/设置所有类成员,而如果它在成员变量上,则Hibernate将直接访问所有成员变量。

换句话说,你不能在同一个实体中混合样式。

答案 2 :(得分:1)

这取决于注释。

一般来说,如果实体具有与字段名称匹配的标准getter / setter,则没有太大区别。我倾向于在给出选择时注释字段,只是因为我发现将注释埋没在方法中以便更难阅读。

答案 3 :(得分:1)

能够选择放置它们的位置有时候很方便,特别是当场地没有公开曝光时。私有getter / setter并不常见,所以能够在字段上添加注释是很有用的。

有时也可以灵活地使用外部/内部数据表示。这是一个有点愚蠢的例子,但我已经使用了几次类似的技巧(herehere):

@Column(...)
private String email;

public String getAlias() { ... split email and return the part before @ ... }
public void setAlias( String alias ) { ... change the part before the @ ... }

public String getHost() { ... split email and return the part after @ ... }
public void setHost(String host) { ... change the part after the @... }

一般来说,我倾向于将它们放在字段上,我发现代码更具可读性。但这主要是品味问题。强制执行的唯一规则就是坚持!

答案 4 :(得分:0)

是的,我会反对过多的注释。当你做反思或类似事情时,这很好,但我不认为有人想读取注释只是因为有人想用它们取代注释。

答案 5 :(得分:0)

我强烈建议在变量之上使用注释,而不是在方法上使用注释。这不是味道。如果要声明从Spring Security实现UserDetails的USER类,这是强制性的。 因此,下面的代码将起作用,这是唯一的方法。

@Entity
class User implements UserDetails {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @OneToMany
    private List<UserRole> roles;

    //....Setters and Getters..........
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }

    @Override
    public boolean isAccountNonExpired() {
        return false;
    }

    @Override
    public boolean isAccountNonLocked() {
        return false;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return false;
    }

    @Override
    public boolean isEnabled() {
        return false;
    }

如果您将所有注释放在函数getter中,而不映射@OneToMany@ManyToMany ......它将起作用,但如果您需要使用这些关系,那么Hibernate将会中断。我认为Hibernate已经在变量之上使用了注释,因此出于一致的原因,它不喜欢函数顶部的注释。

因此,坚持使用框架的常规内容,您不会在以后将代码分解。