代码之家  ›  专栏  ›  技术社区  ›  Mateusz Dymczyk

注释:方法与变量

  •  6
  • Mateusz Dymczyk  · 技术社区  · 16 年前

    我总是确信(不知道为什么)最好给变量添加注释,但是在浏览Hibernate文档时 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 回复  |  直到 16 年前
        1
  •  3
  •   Andrzej Doyle    16 年前

    @Id 注释将用于所有内容。

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

    两者之间没有性能或功能上的差异,所以选择您喜欢的(或者更重要的是,选择您的团队/工具喜欢的)。

        2
  •  2
  •   Péter Török    16 年前

    与 @Id

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

        3
  •  1
  •   Quotidian    16 年前

    这取决于注释。

    一般来说,如果实体具有与字段名匹配的标准getter/setter,则没有太大区别。我倾向于在有选择的情况下对字段进行注释,因为我发现用方法隐藏注释更难阅读。

        4
  •  1
  •   Community Mohan Dere    9 年前

    有时,它还提供了一些灵活性来处理外部/内部数据表示。这是一个有点愚蠢的例子,但我已经使用了类似的伎俩几次( here here ):

    @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 @... }
    

        5
  •  0
  •   JHollanti    16 年前

    是的,我也反对过多的注释。当你在做反射或者类似的事情的时候,这是很好的,但是我不认为任何人仅仅因为有人想用注释替换注释就想阅读注释。

        6
  •  0
  •   V.Tran    9 年前

    我强烈建议在变量上使用注释,而不是在方法上使用注释。这不是品味的问题。如果您想声明实现springsecurity的UserDetails的用户类,那么这是必需的。

    @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

    因此,坚持框架的传统,以后代码就不会崩溃。