枚举?
看到这个类,我懵了,从来没见过啊,这个算是枚举还是类啊,ParamName这个方法中怎么还可以写方法,请高人指点一二,不好意思分不够了
package com.qq.opensns;
/**
* 保存参数,并检查参数值的有效性。
*
* @Version 1.0.0
* @since jdk1.5
* @Copyright©2010, Tencent Corporation. All rights reserved.
* @author dev.opensns@qq.com
*/
public class Param {
// 序列化UID
private static final long serialVersionUID = 7459685922696118066L;
// 枚举OpenAPI的所有参数名
public enum ParamName {
OPENID("openid"),
OPENKEY("openkey"),
APPID("appid"),
APPKEY("appkey"),
REF("ref"),
FOPENID("fopenid"),
FOPENIDS("fopenids"),
APPED("apped"),
INFOED("infoed"),
PAGE("page");
// 存储参数名字符串
private String name;
private ParamName(String name) {
this.name = name;
}
// 取得参数名字符串
public String getName() {
return name;
}
public String toString() {
return name;
}
}
// 参数名
private ParamName key;
// 参数值
private String value;
/**
* 根据key和value构造一个参数对象。
*
* @param key 参数名
* @param value 参数值
* @throws OpensnsException 值value不满足key的格式要求
*/
public Param(ParamName key, String value) throws OpensnsException {
this.key = key;
this.value = value;
// 判断值value是否符合格式要求
boolean isValid = false;
switch (key) {
case OPENID:
isValid = isOpenid(value);
break;
case OPENKEY:
isValid = isHex(value);
break;
case APPID:
isValid = isNonnegative(value);
break;
case APPKEY:
isValid = isHex(value);
break;
case REF:
isValid = isNameString(value);
break;
case FOPENID:
isValid = isOpenid(value);
break;
case FOPENIDS:
isValid = isMultiOpenid(value);
break;
case APPED:
isValid = isInteger(value);
break;
case INFOED:
isValid = isNonnegative(value);
break;
case PAGE:
isValid = isNonnegative(value);
break;
}
// value值不符合类型要求,抛出异常
if ( isValid == false ) {
throw new OpensnsException(ErrorCode.PARAMETER_INVALID,
"parameter [" + key.toString() + "] has invalid value [" + value + "]" );
}
}
/**
* @return 以 key=value 格式输出参数。
*/
public String toString() {
StringBuilder buffer = new StringBuilder();
// 已经限定了参数值value里面不会有特殊字符
buffer.append(key.getName()).append("=").append(value);
return buffer.toString();
}
/**
* 检测是否为十六进制非空字符串
*
* @param value 待检测的字符串
* @return 检测结果
*/
private boolean isHex( String value ) {
return value.matches("^[0-9A-Fa-f]+$");
}
/**
* 检测是否为整形数字
*
* @param value 待检测的字符串
* @return 检测结果
*/
private boolean isInteger( String value) {
try {
Integer.valueOf(value);
return true;
} catch (Exception ex) {
return false;
}
}
/**
* 检测是否为非负整数
*
* @param value 待检测的字符串
* @return 检测结果
*/
private boolean isNonnegative( String value ) {
try {
if (Integer.valueOf(value) < 0 ) {
return false;
}
return true;
} catch (Exception ex) {
return false;
}
}
/**
* 检测是否为普通英文名字符串(字符、数字、下划线)
*
* @param value 待检测的字符串
* @return 检测结果
*/
private boolean isNameString( String value ) {
return (value.matches("^[_0-9A-Za-z]+$"));
}
/**
* 检测是否为OpenID(32位、十六进制数)
*
* @param value 待检测的字符串
* @return 检测结果
*/
private boolean isOpenid( String value ) {
return (value.length() == 32) && isHex( value );
}
/**
* 检测是否为下划线(_)连接的多OpenID串
*
* @param value 待检测的字符串
* @return 检测结果
*/
private boolean isMultiOpenid( String value ) {
String[] list = value.split("_");
if ( list.length == 0 ) {
return false;
}
for (String openid: list ) {
if (isOpenid(openid) == false) {
return false;
}
}
return true;
}
}