当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

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

发表于: 2014-09-13   作者:飞翔的马甲   来源:转载   浏览:
摘要: 前言:版本兼容,一直是迭代开发头疼的事,最近新版本加上了支持新题型,如果新创建一份问卷包含了新题型,那旧版本客户端就不支持,如果新创建的问卷不包含新题型,那么新旧客户端都支持。这里面我们通过给问卷类型枚举增加自定义注解的方式完成。顺便巩固下枚举与注解。 一、枚举 1.在创建枚举类的时候,该类已继承java.lang.Enum类,所以自定义枚举类无法继承别的类,但可以实现接口。
前言:版本兼容,一直是迭代开发头疼的事,最近新版本加上了支持新题型,如果新创建一份问卷包含了新题型,那旧版本客户端就不支持,如果新创建的问卷不包含新题型,那么新旧客户端都支持。这里面我们通过给问卷类型枚举增加自定义注解的方式完成。顺便巩固下枚举与注解。
一、枚举
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等框架上注解解释器的编写。或许会有更大的收货。

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
我本人是从事J2EE开发的,一提到J2EE开发,估计大家第一想到的就是SSH三层架构,当然现在已经不一定
项目结构图如下: 说明: com.test.server包下是mina的服务端程序, MinaServer_Unuse.java 类就是一般
项目结构图如下: 说明: com.test.server包下是mina的服务端程序, MinaServer_Unuse.java 类就是一般
效果展示 点击右下角的btn 在同一个activity里切换到另一个界面 具体实现: 主要java代码 public cl
本文主要是我在实际项目中对C#枚举的应用总结,如果存在不足的地方欢迎您指出。 一、枚举基本运用 1
推荐一个程序员的论坛网站:http://ourcoders.com/home/ 以下内容使用到的技术有:Redis缓存、Sprin
引言 上篇中简单介绍了Ueditor的两种定制方式,想了解的请戳这里:Ueditor的两种定制方式。在项目中
一.配置Gradle使用Maven仓库 项目过程中,我们可能会遇到maven的本地库和gradle使用的maven本地库,不
JSON 一、简介 全称:JavaScript Ojbect Notation,JavaScript对象标记 功能:轻量级数据交换语言
这是本次MVC3讲座中的一个话题,整理出来给大家参考参考 名词解释 依赖注入:英文是Dependency Inje
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号