论坛首页 Java企业应用论坛

如何才算滥用annotation?

浏览 12074 次
精华帖 (2) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-09-19  
java1.5引入了annotation,初看起来非常cool,但是仔细想想它可以被用在什么地方呢?什么样的需求才是用annotation的最佳方式呢?

偶先举几个例子吧:
1. O/R Mapping
比如EJB3的持久化映射, 具体就不用说了, 规范里面非常清楚了, 看代码:
@NamedQueries({
    @NamedQuery(
        name="authorPosts",
        queryString="select p from Post p where p.author = :author"
    );,
    @NamedQuery(
        name="allPosts",
        queryString="select p from Post p"
    );
});

@Entity
@Table(name="FORUM_POST", schema="javaeye");
public class Post {
    private Long _id;
    private String _title;
    private String _content;
    private User _author;
    
    @Id(generate=SEQUENCE, generator ="POST_SEQ");    
    public Long getId(); {
        return _id;
    }
    
    @Column(name="TITLE", nullable=false, length=255);
    public String getTitle(); {
        return _title;   
    }
    
    @Column(name="CONTENT", columnDefinition="CLOB NOT NULL");
    public String getContent(); {
        return _content;
    }
    
    @ManyToOne(optional=false);
    @JoinColumn(name="AUTHOR_ID", nullable=false, updatable=false);
    public User getAuthor(); {
        return _author;
    }
}


2. 校验
比如WebWork的visitor方式校验,能够将action的校验,转发到Entity上, 以前的写法是写一个Post-validation.xml:

<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
	<field name="title">
        <field-validator type="requiredstring">
            <message>Please input title.</message>
        </field-validator>
    </field>
    <field name="content">
        <field-validator type="requiredstring">
            <message>Please input content.</message>
        </field-validator>
    </field>
</validators>


改用annotation成:
    @Validator(type="requiredstring", message="Please input title.");
    public String getTitle(); {
        return _title;   
    }
    
    @Validator(type="requiredstring", message="Please input content.");
    public String getContent(); {
        return _content;
    }


3. 索引
比如用lucene做全文搜索,以前是写一个Post-lucene.xml, 当一个Post被持久化的时候,能够自动根据这个配置文件对相应的属性做不同的索引处理:
<lucene>
    <field type="Keyword" fieldName="title"/>
    <field type="Text" fieldName="content"/>
</lucene>


改用annotation成:
    @LuceneIndex(type="KEYWORD");
    public String getTitle(); {
        return _title;   
    }
    
    @LuceneIndex(type="TEXT");
    public String getContent(); {
        return _content;
    }




如果将3种annotation都混合在一起,整个Post Entity将会变成:
@NamedQueries({
    @NamedQuery(
        name="authorPosts",
        queryString="select p from Post p where p.author = :author"
    );,
    @NamedQuery(
        name="allPosts",
        queryString="select p from Post p"
    );
});

@Entity
@Table(name="FORUM_POST", schema="javaeye");
public class Post {
    private Long _id;
    private String _title;
    private String _content;
    private User _author;
    
    @Id(generate=SEQUENCE, generator ="POST_SEQ");    
    public Long getId(); {
        return _id;
    }
    
    @Column(name="TITLE", nullable=false, length=255);
    @Validator(type="requiredstring", message="Please input title.");
    @LuceneIndex(type="KEYWORD");
    public String getTitle(); {
        return _title;   
    }
    
    @Column(name="CONTENT", columnDefinition="CLOB NOT NULL");
    @Validator(type="requiredstring", message="Please input content.");
    @LuceneIndex(type="TEXT");
    public String getContent(); {
        return _content;
    }
    
    @ManyToOne(optional=false);
    @JoinColumn(name="AUTHOR_ID", nullable=false, updatable=false);
    public User getAuthor(); {
        return _author;
    }
}


本来干干净净的一个Post POJO,变成了充满annotation的怪家伙,这可以称之为annotation的滥用么?难道又一个AOP出现了?难道以后偶们打开一个Java文件必须用Eclipse之类的IDE,好让它自动将annotation fold,免得花了眼睛么?

你对annotation的意见如何?
   发表时间:2005-09-19  
我的观点:能放到配置文件里面的,一般还是不放在源码里

否则改起来岂不是自找麻烦
0 请登录后投票
   发表时间:2005-09-19  
我对Annotation的感觉是:
他确实有被滥用的趋势。 但是我个人认为也有相当一部分人坚持这么一个观点:
与源代码放在一起未必是坏事,比如说它可以更方便编写配置,更大限度减少出错几率,更加将配置+编码结合在一起。 配置和编码一起写会比较方便而且会逻辑紧密一些。

但是Annotation有几个很大的缺陷:
1) 跟源代码放在一起,修改即等同于修改源代码。
2) 失去模块化的逻辑,使得本来一些联系比较紧密的配置分散到各个源代码中去。

3) 配置和代码放在一起,会不会造成模糊化 配置 和 编码之间的区别。


其实,就我实际的开发来说,我个人感觉仅仅对于编写映射信息方面,感觉Annotation更好写,比起XML 编写来说 ,主要原因是 我是看着源代码来编写,而且是在支持编译检查的IDE中编写。
至于说他造成源代码文件庞大的问题,这个问题倒不是关键,因为Annotation的语法区分在 IDE中还是一目了然的。
0 请登录后投票
   发表时间:2005-09-19  
annotation 本来就是自定义的。搞民主,还怕乱,那怎么行?赫赫
0 请登录后投票
   发表时间:2005-09-19  
只跟目前代码段有关的内容 (非全局的配置)一概放在Annotation\Attribute里,影响全局的放在XML里,例如dotNet里,App.config和Web.Config。

所以对你的例子而言,我会先把lunce放在XML里,因为它不是a part of entity,拆开没什么问题。

WebWork我不熟,不发表意见,但也是和上面一样的道理,可以拆之,或放XML,或在别的method的annotation里。
0 请登录后投票
   发表时间:2007-03-20  
annotation的本意是有一些代码难以描述,但属于类紧密相关的的信息,如属性的值域范围,是否主key,唯一性约束,哪些属性受其影响等.这些信息都是代码的延伸,但代码没有描述的对象核心元数据。
但我不太同意将O/R Mapping(仅为hibernate或DAO使用)的元数据,Validation(为UI使用)的信息放到类中,首先在层次上就不够清晰,其次,annotation中将充斥着各个层次的元数据,维护,可阅读性都是问题
0 请登录后投票
   发表时间:2007-03-20  
annotation本身就是程序的一部分,它和普通的代码之间,除了形式上的不同,没有什么区别.

所以,以前不想在程序中硬编码的功能,也就不要用annotation.

同一楼上的观点.
0 请登录后投票
   发表时间:2007-03-20  
引用

1) 跟源代码放在一起,修改即等同于修改源代码。

-----------------------------

经常听人说,使用annotation使得修改一点点配置就要修改代码。可能不是任何东西都用annotation好,但是使用hibernate用annotation确实最棒的。

使用annotation能够快速开发系统,一个地方完成功能和配置需求,这个特点就值得你去使用。
使用annotation就能够在你看代码时,不必再在多种格式的文件中来回游荡,这个特点使人轻松。

更改配置时,改一下源代码,不是一件多恐怖的事情。
0 请登录后投票
   发表时间:2007-03-20  
抛出异常的爱 写道
lighter 写道
抛出异常的爱 写道
annotation
人造夹层
本来单层的java
又加入了一层

比html标签中加入<%%>还恶心
平白的增加出错机会...不禁要问为什么?

jsp面页难到不是大家用过的最恶心的东西么
灵活么?好用么?美么?


唯一的好处就是大牛门又可以写出如C++般的魔术代码

我们常在页面用JSP2.0的jstl,觉得功能有一些不完善,但也挺好用的啊
也不要一棍子把jsp打死
Annotation用得好,可以减去很多重复的xml配置,举一个例子 属性名与数据库属性字段相同时,用Annotaion可以简洁很多
自己乱说一通,跑题了
annotation
平空多加了一层
但是对他的好处也只是对xml打的补丁.....
或者它根本就不应该那么用....

如果annotaion配错了
而且上传到SVN上之后布署不通过
怎么才能知道是哪个
annotation配错了?

看日志.....?
0 请登录后投票
   发表时间:2007-03-20  
annotation配错了,等价于相关的xml配错了。排错不是一样的吗?

看异常日志不是件坏事。看了日志不就知道是什么配错了吗(比如找不到列,或找不到类等等)

异常是个可爱的东西。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics