枚举?

luoxudong121316 2011-01-14 11:59:42
看到这个类,我懵了,从来没见过啊,这个算是枚举还是类啊,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;
}
}
...全文
113 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
whut_lcy 2011-01-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ticmy 的回复:]
枚举也是类的一种,你这个ParamName只是内部类而已
[/Quote].
龙四 2011-01-16
  • 打赏
  • 举报
回复
枚举也是类的一种,你这个ParamName只是内部类而已
huyong479072052 2011-01-16
  • 打赏
  • 举报
回复
这是个枚举类啊、、、
当很多个类都要用到你定义的枚举时
就最好将枚举单独写一个类 这样比较规范
冰思雨 2011-01-14
  • 打赏
  • 举报
回复
这个,是个枚举类。
基本数据类型里面有枚举类型,类类型里面也有枚举类。
用法大致相同,只是,要区别,是枚举变量还是枚举对象。
ttchenwei 2011-01-14
  • 打赏
  • 举报
回复
枚举里面写方法不是很正常吗? 枚举只是个特殊的类而已

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧