`
飞翔的马甲
  • 浏览: 4759 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

项目中 枚举与注解的结合使用

阅读更多
前言:版本兼容,一直是迭代开发头疼的事,最近新版本加上了支持新题型,如果新创建一份问卷包含了新题型,那旧版本客户端就不支持,如果新创建的问卷不包含新题型,那么新旧客户端都支持。这里面我们通过给问卷类型枚举增加自定义注解的方式完成。顺便巩固下枚举与注解。
一、枚举
1.在创建枚举类的时候,该类已继承java.lang.Enum类,所以自定义枚举类无法继承别的类,但可以实现接口。
    public interface Behaviour {  
        void print();  
        String getInfo();  
    }  
    public enum Color implements Behaviour{  
        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  
        // 成员变量  
        private String name;  
        private int index;  
        // 构造方法  
        private Color(String name, int index) {  
            this.name = name;  
            this.index = index;  
        }  
    //接口方法  
        @Override  
        public String getInfo() {  
            return this.name;  
        }  
        //接口方法  
        @Override  
        public void print() {  
            System.out.println(this.index+":"+this.name);  
        }  
    }  

2.枚举类的构造方法使用private,如果可以构造枚举值,那枚举类的存在价值就没了.
3.枚举值对应的是枚举类的Field(属性),可以通过name()方法获取值本身的属性名。
4.使用枚举直观可读性强,但是相对的,存取的时候需要转化,在使用hibernate的时候,需要自定义一个新的映射类型。传送门:http://bbs.csdn.net/topics/350033653
二、注解
1.定义一个注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface VersionSupport {
	public String value() default "";
	public int id();
}

2.javaSE5 标准注解@Override @Deprecated @SuppressWarnings
3.新的注解创建:@Target注解应用的地方 @Retention注解保存的级别 @Document 注解包含在javaDoc中 @Inherited子类允许继承父类中的注解
4.从原理上讲,注解处理就是通过反射机制获取被检查方法(属性.类)上的注解信息,然后根据注解元素的值进行特定的处理。在实例中将详细看到。
三、实例
1.添加新题型前的模型
public class Survey {
    //问卷支持版本
    private String versionSupport;
    private List<Question> questions;
}
public class Question {
	private QuestionType questionType;
	private String content;
}
public enum QuestionType {
	RADIT(1,"单选题"),	
	CHECK_BOX(2,"多选题");
	private int key;
	private String value;
	private QuestionType(int key, String value){
		this.key = key;
		this.value = value;
	}
}

2.现在增加一个新的题型(填空题),那么老的客户端对包含新题型的问卷肯定不支持,为了解决这个问题,可以在Survey类中增加一个新字段标记当前问卷支持的版本。这样就可以通过比对客户端传来的版本信息与问卷支持的版本信息来解决问题。那么如何获取问卷支持的版本呢呢?注解的作用来了:
/**
 * 版本支持注解
 * @author 飞翔的小马甲
 * @since 2014年9月11日 下午10:12:34
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface VersionSupport {
	public String value();
}
public enum QuestionType {
	RADIT(1,"单选题"),
	@VersionSupport("1.1")
	CHECK_BOX(2,"多选题"),
	@VersionSupport("1.2")
	TEXT(3,"填空题");
	private int key;
	private String value;
	private QuestionType(int key, String value){
		this.key = key;
		this.value = value;
	}
}

3.survey新增一个方法获取当前支持的版本(注解解释器)问卷的questions初始化好以后,调用该方法。
/**
 * 问卷类
 * 
 * @author 飞翔的小马甲
 * @since 2014年9月11日 下午10:36:16
 */
public class Survey {
    //问卷支持版本
    private String versionSupport;
    private List<Question> questions;

    public String getVersionSupport() {
	return versionSupport;
    }

    public void setVersionSupport(String versionSupport) {
	this.versionSupport = versionSupport;
    }

    public List<Question> getQuestions() {
	return questions;
    }

    public void setQuestions(List<Question> questions) {
	this.questions = questions;
    }

    public void initVersionSupport() throws Exception {
	float vs = 0.0f;
	for (Question question : questions) {
	    Field field = QuestionType.class.getField(question
		    .getQuestionType().name());
	    VersionSupport support = field.getAnnotation(VersionSupport.class);
	    if(support == null){
		continue;
	    }else{
		vs = Math.max(vs, Float.parseFloat(support.value()));
	    }
	}
	versionSupport = String.valueOf(vs);
    }
    @Override
    public String toString() {
	return "Survey [versionSupport=" + versionSupport + ", questions="
		+ questions + "]";
    }   
}

4.开动测试,一切ok
/**
 * 
 * @author XieFeixiang
 * @since
 * @version 2014年9月12日 t上午11:22:08
 */
public class Client {
    public static void main(String[] args) {
	List<Question> questions = new ArrayList<Question>();
	questions.add(new Question(QuestionType.CHECK_BOX, "题目一"));
	questions.add(new Question(QuestionType.TEXT, "题目二"));
	questions.add(new Question(QuestionType.RADIT, "题目三"));
	Survey survey = new Survey();
	survey.setQuestions(questions);
	try {
	    survey.initVersionSupport();
	} catch (Exception e) {
	    e.printStackTrace();
	}
	System.out.println(survey);
    }
}

5.输出结果
Survey [versionSupport=1.2, questions=[Question [questionType=CHECK_BOX, content=题目一], Question [questionType=TEXT, content=题目二], Question [questionType=RADIT, content=题目三]]]
五、总结
这里只是对注解的简单应用,接下来会参考spring,hibernate等框架上注解解释器的编写。或许会有更大的收货。
分享到:
评论

相关推荐

    深入分析安卓(Android)中的注解

    Android中的注解是一种元数据,用于向编译器或构建工具提供有关代码的附加...不过,值得注意的是,虽然注解能提供很多便利,但过度依赖或不恰当使用也可能导致代码复杂度增加,因此在使用时应适度并结合实际情况选择。

    用enum实现单例模式的方法来读取配置文件

    在实际开发中,根据项目需求,还可以考虑使用Spring框架的`@ConfigurationProperties`注解来绑定配置文件,实现更强大的类型安全和属性映射功能。不过,对于简单的配置管理,枚举单例模式已经足够实用。

    Android注解基础介绍快速入门与解读

    自定义注解通常结合注解处理器(如Java的APT或Kotlin的KSP)一起使用,以便在编译期间生成额外的代码或执行特定的验证。 例如,创建一个自定义注解`@MyAnnotation`,可以这样定义: ```java @Retention...

    自定义注解

    ### 自定义注解详解 #### 一、注解概述 注解是Java 5引入的一种新特性,它允许开发者在代码中嵌入元数据。与普通的注释不同,注解不仅...在实际项目开发中,应充分考虑使用自定义注解来优化代码结构和简化开发流程。

    05_JPA详解_日期_枚举等字段类型的JPA映射.zip

    Java中的枚举类型可以方便地与数据库中的字符串或整型字段进行映射。JPA提供了`@Enumerated`注解来处理枚举字段: - `@Enumerated(EnumType.STRING)`:将枚举值转换为字符串存储。 - `@Enumerated(EnumType.ORDINAL...

    spring mvc注解方式

    在Spring MVC框架中,注解方式的使用极大地简化了Web应用程序的开发,使得开发者无需编写大量的XML配置文件,即可实现控制器、模型、视图以及数据访问的绑定。结合MyBatis,一个轻量级的持久层框架,可以构建高效、...

    Java元注解.docx

    Java元注解是Java语言中的一种特殊注解,它们用于定义和控制其他注解的行为和生命...通过熟练掌握元注解的使用,开发者可以有效地利用注解来提高代码的可读性、可维护性和可扩展性,尤其是在大型项目和框架的开发中。

    java自定义注解学习范例

    此外,自定义注解可以与其他框架或库结合使用,实现AOP(面向切面编程)、代码生成、验证等功能。例如,在Spring框架中,可以使用自定义注解来实现组件扫描和依赖注入。 总的来说,Java自定义注解是一种强大的工具...

    java元注解简单实现.zip

    在Spring中,开发者可以使用自定义注解,结合元注解,来实现各种功能,如依赖注入、AOP(面向切面编程)、事件监听等。例如,你可以创建一个自定义的`@MyAnnotation`,并使用`@Retention(RUNTIME)`和`@Target...

    使用注解自动生成Router以及Router相关参数.zip

    本文将深入探讨Swift中使用注解实现路由自动化的方法,以及它在iOS和macOS开发中的应用。 首先,注解(Annotation)是一种元数据,允许开发者在代码中添加额外的信息,这些信息通常不直接影响程序的运行,但可以被...

    折射-反射-枚举-单元测试综合案例

    Myannotation文件名可能暗示了案例中涉及到了自定义注解的使用,这在Java中常与反射结合,用于标记或元数据驱动的编程。 在实际应用中,这样的案例可能是为了演示如何在复杂系统中灵活地管理和扩展代码,同时也强调...

    nh枚举保存为字符学习

    总之,“nh枚举保存为字符”涉及的是在NHibernate中使用枚举类型并将其转换为字符串存储的策略。理解这些方法并根据项目需求选择合适的方式,可以提高代码的可维护性和灵活性。在实际开发中,应结合具体场景,权衡...

    springmvc中json转换的jar

    3. **控制器方法**:在控制器的方法中,使用`@RequestBody`和`@ResponseBody`注解来接收和返回JSON数据。Spring MVC会自动使用相应的MessageConverter进行转换。 通过这种方式,Spring MVC可以无缝地处理JSON请求和...

    DictMapper:将枚举映射为数据字典,可用于前级共享数据字典

    被注解的枚举类 @MapDict ( code = " status_flags " , name = "状态" ) public enum StatusEnum { @Label ( "正常" ) @Styled ( " success " ) NORMAL ( " 0 " ), @Label ( "禁用" ) @Styled ( " danger " ) ...

    源码分析1

    Java 注解源码分析 Java 注解是一种元数据机制,它允许程序员在代码中嵌入信息,这些信息可以在编译时或运行时被解析和...在实际项目中,合理运用注解可以极大地提高代码的可读性和可维护性,同时减少手动配置和错误。

    Java Annotation手册

    注解可以与编译器插件结合,实现代码的验证和优化。例如,JSR 303/JSR 349 提供的 @Valid 注解用于数据校验。 5.2 ORM框架集成 在ORM框架如Hibernate中,注解被用于映射Java对象到数据库表,简化了配置并增强了...

    开源项目-lyft-protoc-gen-validate.zip

    Protocol Buffer是Google推出的一种数据序列化协议,它允许开发者定义数据结构,然后生成能够在各种编程语言中使用的类库,方便数据的序列化和反序列化。这个开源项目的核心目标是帮助开发者在protobuf消息模型中...

    国家电力项目实战(共9天)

    4. **枚举**:枚举类型的使用场景及其与常量的区别。 5. **网络编程**:Socket编程的基础、HTTP协议的理解与实现。 #### 实战技能 1. **数据库操作**:使用JDBC进行数据库连接、查询、更新等操作。 2. **Web开发**...

    java编程思想第四版源代码.7z

    9. **枚举与注解**:Java 5引入了枚举和注解,源代码可能包含枚举类型的定义和使用,以及自定义注解及其元注解的实践。 10. **网络编程**:如果源代码涉及到网络通信,可能会用到Socket、ServerSocket等类,实现...

    PreferenceRoom,更有效地管理Android项目的共享引用。.zip

    然而,原生的 SharedPreferences API 使用起来可能较为繁琐,需要手动编写序列化和反序列化的代码,这在大型项目中可能导致代码混乱和难以维护。PreferenceRoom 的出现就是为了解决这个问题,它引入了注解驱动的编程...

Global site tag (gtag.js) - Google Analytics