`

annotation定义字段默认值

    博客分类:
  • j2se
 
阅读更多

java1.5引入了annotation,初看起来非常cool,但是仔细想想它可以被用在什么地方呢?什么样的需求才是用annotation的最佳方式呢?

偶先举几个例子吧:
1. O/R Mapping
比如EJB3的持久化映射, 具体就不用说了, 规范里面非常清楚了, 看代码:

Java代码 复制代码 收藏代码
  1. @NamedQueries({   
  2.     @NamedQuery(   
  3.         name="authorPosts",   
  4.         queryString="select p from Post p where p.author = :author"  
  5.     );,   
  6.     @NamedQuery(   
  7.         name="allPosts",   
  8.         queryString="select p from Post p"  
  9.     );   
  10. });   
  11.   
  12. @Entity  
  13. @Table(name="FORUM_POST", schema="javaeye");   
  14. public class Post {   
  15.     private Long _id;   
  16.     private String _title;   
  17.     private String _content;   
  18.     private User _author;   
  19.        
  20.     @Id(generate=SEQUENCE, generator ="POST_SEQ");       
  21.     public Long getId(); {   
  22.         return _id;   
  23.     }   
  24.        
  25.     @Column(name="TITLE", nullable=false, length=255);   
  26.     public String getTitle(); {   
  27.         return _title;      
  28.     }   
  29.        
  30.     @Column(name="CONTENT", columnDefinition="CLOB NOT NULL");   
  31.     public String getContent(); {   
  32.         return _content;   
  33.     }   
  34.        
  35.     @ManyToOne(optional=false);   
  36.     @JoinColumn(name="AUTHOR_ID", nullable=false, updatable=false);   
  37.     public User getAuthor(); {   
  38.         return _author;   
  39.     }   
  40. }  
@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:

Xml代码 复制代码 收藏代码
  1. <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">  
  2. <validators>  
  3.     <field name="title">  
  4.         <field-validator type="requiredstring">  
  5.             <message>Please input title.</message>  
  6.         </field-validator>  
  7.     </field>  
  8.     <field name="content">  
  9.         <field-validator type="requiredstring">  
  10.             <message>Please input content.</message>  
  11.         </field-validator>  
  12.     </field>  
  13. </validators>  
<!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成:

Java代码 复制代码 收藏代码
  1. @Validator(type="requiredstring", message="Please input title.");   
  2. public String getTitle(); {   
  3.     return _title;      
  4. }   
  5.   
  6. @Validator(type="requiredstring", message="Please input content.");   
  7. public String getContent(); {   
  8.     return _content;   
  9. }  
    @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被持久化的时候,能够自动根据这个配置文件对相应的属性做不同的索引处理:

Xml代码 复制代码 收藏代码
  1. <lucene>  
  2.     <field type="Keyword" fieldName="title"/>  
  3.     <field type="Text" fieldName="content"/>  
  4. </lucene>  
<lucene>
    <field type="Keyword" fieldName="title"/>
    <field type="Text" fieldName="content"/>
</lucene>



改用annotation成:

Java代码 复制代码 收藏代码
  1. @LuceneIndex(type="KEYWORD");   
  2. public String getTitle(); {   
  3.     return _title;      
  4. }   
  5.   
  6. @LuceneIndex(type="TEXT");   
  7. public String getContent(); {   
  8.     return _content;   
  9. }  
    @LuceneIndex(type="KEYWORD");
    public String getTitle(); {
        return _title;   
    }
    
    @LuceneIndex(type="TEXT");
    public String getContent(); {
        return _content;
    }





如果将3种annotation都混合在一起,整个Post Entity将会变成:

Java代码 复制代码 收藏代码
  1. @NamedQueries({   
  2.     @NamedQuery(   
  3.         name="authorPosts",   
  4.         queryString="select p from Post p where p.author = :author"  
  5.     );,   
  6.     @NamedQuery(   
  7.         name="allPosts",   
  8.         queryString="select p from Post p"  
  9.     );   
  10. });   
  11.   
  12. @Entity  
  13. @Table(name="FORUM_POST", schema="javaeye");   
  14. public class Post {   
  15.     private Long _id;   
  16.     private String _title;   
  17.     private String _content;   
  18.     private User _author;   
  19.        
  20.     @Id(generate=SEQUENCE, generator ="POST_SEQ");       
  21.     public Long getId(); {   
  22.         return _id;   
  23.     }   
  24.        
  25.     @Column(name="TITLE", nullable=false, length=255);   
  26.     @Validator(type="requiredstring", message="Please input title.");   
  27.     @LuceneIndex(type="KEYWORD");   
  28.     public String getTitle(); {   
  29.         return _title;      
  30.     }   
  31.        
  32.     @Column(name="CONTENT", columnDefinition="CLOB NOT NULL");   
  33.     @Validator(type="requiredstring", message="Please input content.");   
  34.     @LuceneIndex(type="TEXT");   
  35.     public String getContent(); {   
  36.         return _content;   
  37.     }   
  38.        
  39.     @ManyToOne(optional=false);   
  40.     @JoinColumn(name="AUTHOR_ID", nullable=false, updatable=false);   
  41.     public User getAuthor(); {   
  42.         return _author;   
  43.     }   
  44. }  
@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的意见如何?

分享到:
评论

相关推荐

    Annotation详细介绍(大全)

    通过`default`关键字,可以在Annotation定义中为参数设置默认值,这样在使用时可以选择不提供值,直接使用默认值。 6. **枚举与Annotation**: 枚举可以用于限制Annotation参数的取值范围,如`name() default My...

    JavaAnnotation手册.pdf

    通过定义成员变量(通常带有默认值),可以为Annotation添加特定的元数据。自定义Annotation可以通过`@interface`关键字创建,并可以通过反射API在运行时获取。 3. 处理Annotation:处理Annotation通常是通过Java...

    自定义Annotation例子

    在Java中,Annotation定义类似于接口,使用`@interface`关键字。以下是一个简单的自定义Annotation例子: ```java public @interface MyAnnotation { String value() default ""; } ``` 这里的`MyAnnotation`就是...

    重难点之JavaAnnotation手册.pdf

    - Annotation类型是一种接口,定义了Annotation的结构和名称,其成员变量具有预定义的类型和默认值。 2. 标准和自定义Annotation: - Java 5.0引入了一些标准Annotation,如`@Override`、`@Deprecated`、`@ ...

    Java Annotation注解.doc

    每个方法定义了一个成员,方法返回类型有限制,可以是基本类型、字符串、类、枚举、注解或它们的数组,并可以有默认值。 ```java public @interface RequestForEnhancement { int id(); String synopsis(); ...

    Annotation使用手册

    - **Annotation 类型**: 定义了 Annotation 的名称、类型和成员的默认值。Annotation 类型本质上是一个特殊的 Java 接口,其成员变量受到一定的限制。声明 Annotation 类型时需要使用新的语法。 - **Annotation 成员...

    Annotation注解的介绍和使用

    注解可以定义参数,参数类似于类中的字段,可以通过`int`, `double`, `boolean`, `String`, `Class`, `Enum`, 或其他注解等类型指定。 ```java public @interface MyAnnotation { String value(); } ``` ##### ...

    Java Annotation

    #### 一、Java Annotation 的定义及作用 Java Annotation(注解)是自 Java 5.0 开始引入的一种语言元素,它为开发者提供了在代码中添加元数据的能力。简单来说,注解就像是对代码进行标记或注释的方式,这些标记...

    Annotation(注解)详细教程,jdk新特性

    在Java中,Annotation定义为一种接口,可以通过反射API访问其信息。它们的使用非常灵活,可以应用于不同的程序元素,包括包、类、方法、字段、参数甚至局部变量。每个Annotation由一个名称和一个或多个成员组成,...

    Java.Annotation

    定义一个Annotation类型通常使用`@interface`关键字,它可以包含一些成员,这些成员可以是基本类型、字符串、枚举或其他Annotation类型。成员的默认值可以通过`default`关键字来设置。例如,定义一个简单的Marker ...

    annotation

    Annotation,或称为注解,是Java编程语言中的一个重要特性,自Java 5引入以来,它在软件开发中扮演着越来越重要的角色。注解是一种元数据,允许程序员在源代码中嵌入额外的信息,这些信息可以被编译器、IDE或其他...

    annotation详解

    定义注解使用`@interface`关键字,可以包含成员,成员默认值和保留策略。例如: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String value() ...

    annotation.zip

    自定义注解以`@interface`关键字开始,你可以定义自己的属性,这些属性可以有默认值。例如: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { ...

    java1.5 annotation注释源代码

    - **默认值**:在定义注解时,可以为元素提供默认值。这样,当使用注解时,如果未显式指定该元素,就会使用默认值。 ### 4. 注解的应用场景 - **编译时检查**:例如`@Override`确保方法确实重写了父类方法。 - **...

    Java 5 annotation 学习笔记

    - 当定义一个注解时,实际上实现了`java.lang.annotation.Annotation`接口。注解类型的声明不允许有父接口或父类。 4. Retention策略: - `java.lang.annotation.Retention`:用于控制注解的生命周期,决定它在...

    Java自定义注解使用反射获取字段注解

    定义一个注解的基本结构如下: ```java import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface MyCustomAnnotation { String value() default ""; ...

    JAVA Annotation学习

    自定义注解可以没有任何元素,也可以包含成员变量(通常称为元素),并为其提供默认值。 3. 注解的保留策略: - 注解的生命周期由其保留策略决定,主要有两种:SOURCE(源码级)、CLASS(编译时)和RUNTIME(运行...

    Java annotation (JDK5)

    Java的`javax.annotation.processing.Processor`接口定义了注解处理器的规范。 5. 使用注解 注解可以应用于类、方法、字段、参数、构造函数、包等不同级别。例如: ```java @MyAnnotation("Hello, World!") ...

Global site tag (gtag.js) - Google Analytics