项目中提交功能中或多或少会使用到非空校验,一个两个参数还好,如果很多咋办?老实说,一般来写又臭又长.除了非空还有非0校验呢~在下手头项目中遇到参数校验不下100个,写哭了...
1.0写法,activity/fragment构造请求体
if (TextUtils.isEmpty(testname)) {
ToastUtil.showShort(mContext, "试验名称不能为空");
return;
}
if (mMapperResp == null) {
ToastUtil.showShort(mContext, "试验负责人不能为空");
return;
}
if (mBaseSelcFuncBean == null) {
ToastUtil.showShort(mContext, "试验类型不能为空");
return;
}
if (cropId == 0) {
ToastUtil.showShort(mContext, "作物类别不能为空");
return;
}
if (varietiesId == 0) {
ToastUtil.showShort(mContext, 作物品种不能为空");
return;
}
json.testName = 试验名称;
json.a = 试验负责人;
json.b = 实验类型;
json.c = 作物类别;
json.d = 作物品种;
IHtmlHttpRequestImpl.execPost(json, new SafeHttpCallbackAdapt<String>(iLoading,
getActivity()) {};// 发起网络请求
这样写很丑很臭很长,不知道您发现没有~
2.0写法activity/fragment构造请求体
public class IException extends RuntimeException {
public IException(String message) {
super(message);
}
}
--->>submit--->>
try {
json.testName = 试验名称;
json.a = 试验负责人;
json.b = 实验类型;
json.c = 作物类别;
json.d = 作物品种;
json.check();
IHtmlHttpRequestImpl.execPost(json, new SafeHttpCallbackAdapt<String>(iLoading,
getActivity()) {};// 发起网络请求
} catch (Exception e) {
e.printStackTrace();
if(e instanceof IException){
ToastUtil.showShort(mContext, e.getMessage());
}
}
--->>check--->>校验逻辑封装,外包出去,activity/fragment清爽不少,当然逻辑还是没有少啦.
public void check(){
if (cropId == 0) {
throw new IException("作物类别不能为空");
}
if (varietiesId == 0) {
throw new IException("作物品种不能为空");
}
if (Tools.isEmpty(cropArea)) {
throw new IException("作物面积不能为空,输入0到9个9,保留两位小数");
}
if (Tools.isEmpty(age)) {
throw new IException("树龄不能为空");
}
if (Tools.isEmpty(soil)) {
throw new IException("土壤质地不能为空");
}
}
3.0写法activity/fragment构造请求体 使用注解,给字段加限制
1.构建注解
@Inherited
@Documented
@Target({ElementType.METHOD, ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckAdapt {
/**
* 检测类型
*/
int checkType() default ParamCheckType.EMPTY_CHECK;
/**
* 检测排位,第一个参数就赋值1 第二个参数就赋值2 按顺序判断 非空,非零
*
* @return
*/
int checkRank() default ParamCheckType.EMPTY_CHECK;
/**
* 参数名字
*
* @return
*/
String paramsName();
}
2.弄个接口耍
public interface IParseAdapt<T> {
void parse(T t);
}
3.核心代码实现(注解字段除了list其它用object接收就好啦,干嘛分那么细,老实说,我是在测试哈哈哈)
public class IParseAdaptImpl<T> implements IParseAdapt<T>, ParamCheckType {
@Override
public void parse(T target) {
long startTime = System.currentTimeMillis();
Field[] allFields = getAllFields(target);
TreeMap<Integer, Field> hash = new TreeMap<>();
if (allFields.length > 0) {
for (Field field : allFields) {
field.setAccessible(true);
if (field.isAnnotationPresent(CheckAdapt.class)) {
CheckAdapt mCheckAdapt = field.getAnnotation(CheckAdapt.class);
if (mCheckAdapt != null) {
hash.put(mCheckAdapt.checkRank(), field);
}
}
}
}
for (Map.Entry<Integer, Field> entrys : hash.entrySet()) {
Field mField = entrys.getValue();
try {
Class<?> mType = mField.getType();
CheckAdapt mCheckAdapt = mField.getAnnotation(CheckAdapt.class);
if (mType == List.class) {
List list = (List) mField.get(target);
//DeepCheck
if (list == null || list.isEmpty()) {
parse(mCheckAdapt, "");
} else {
for (Object item : list) {
if (item instanceof DeepCheck) {
DeepCheck mDeepCheck = (DeepCheck) item;
switch (mDeepCheck.getType()) {
default:
try {
if (Tools.isEmpty(mDeepCheck.text())) {
throw new IException(mDeepCheck.getTypeValues()[mDeepCheck.getType()] + NO_EMPTY);
}
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
break;
}
}
}
}
LogUtils.e("校验", "=list:" + list);
} else if (mType == String.class) {
String list = (String) mField.get(target);
parse(mCheckAdapt, list);
LogUtils.e("校验", "=String:" + list);
} else if (mType == Long.class || mType == long.class) {
Long list = (Long) mField.get(target);
parse(mCheckAdapt, list);
LogUtils.e("校验", "=Long:" + list);
} else if (mType == Short.class || mType == short.class) {
Short list = (Short) mField.get(target);
parse(mCheckAdapt, list);
LogUtils.e("校验", "=Short:" + list);
} else if (mType == Byte.class || mType == byte.class) {
Byte list = (Byte) mField.get(target);
parse(mCheckAdapt, list);
LogUtils.e("校验", "=Byte:" + list);
} else if (mType == Double.class || mType == double.class) {
Double list = (Double) mField.get(target);
parse(mCheckAdapt, list);
LogUtils.e("校验", "=Double:" + list);
} else if (mType == Boolean.class || mType == boolean.class) {
Boolean list = (Boolean) mField.get(target);
String result;
if (list == null || list) {
result = "";
} else {
result = list.toString();
}
parse(mCheckAdapt, result);
LogUtils.e("校验", "=Boolean:" + list);
} else if (mType == Float.class || mType == float.class) {
Float list = (Float) mField.get(target);
parse(mCheckAdapt, list);
LogUtils.e("校验", "=Float:" + list);
} else if (mType == Character.class || mType == char.class) {
Character list = (Character) mField.get(target);
parse(mCheckAdapt, list);
LogUtils.e("校验", "=Character:" + list);
} else if (mType == Integer.class || mType == int.class) {
Integer list = (Integer) mField.get(target);
parse(mCheckAdapt, list);
LogUtils.e("校验", "=Integer:" + list);
} else {
boolean array = mField.getType().isArray();
if (array) {
}
LogUtils.e("校验", "=是数组吗:" + array);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
LogUtils.e("校验", "=异常啦:" + e);
}
// } catch (Exception e) {
// e.printStackTrace();
// LogUtils.e("校验", "=异常啦:" + e);
// }
}
long endTime = System.currentTimeMillis();
LogUtils.e("校验", "=================>程序运行时间:" + (endTime - startTime) + "毫秒");
}
public void parse(CheckAdapt mCheckAdapt, Object target) {
LogUtils.e("校验", "===目标====[" + target + "]");
String list = "" + (target == null ? "" : target.toString());
LogUtils.e("校验", "===目标转换====[" + list + "]");
switch (mCheckAdapt.checkType()) {
case ParamCheckType.EMPTY_CHECK:
if (Tools.isEmpty(list)) {
throw new IException(mCheckAdapt.paramsName() + NO_EMPTY);
}
break;
case ParamCheckType.ZERO_CHECK:
if (!Tools.isEmpty(list)) {
try {
Double aDouble = Double.valueOf(list);
if (aDouble <= ZERO) {
throw new IException(mCheckAdapt.paramsName() + NO_ZERO);
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
break;
case ParamCheckType.EMPTY_AND_ZERO_CHECK:
if (Tools.isEmpty(list)) {
throw new IException(mCheckAdapt.paramsName() + NO_EMPTY);
}
try {
Double aDouble = Double.valueOf(list);
if (aDouble <= ZERO) {
throw new IException(mCheckAdapt.paramsName() + NO_ZERO);
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
break;
}
}
public static Field[] getAllFields(Object object) {
if (object == null) {
Field[] fields = new Field[]{};
return fields;
}
Class clazz = object.getClass();
List<Field> fieldList = new ArrayList<>();
Field[] declaredFields = clazz.getDeclaredFields();
List<Field> temps = new ArrayList<>();
for (Field field : declaredFields) {
temps.add(field);
}
fieldList.addAll(temps);
while (clazz != null) {
fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
clazz = clazz.getSuperclass();
}
Field[] fields = new Field[fieldList.size()];
fieldList.toArray(fields);
return fields;
}
}
public static class Tst {
@CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "树龄", checkRank = 1)
public int x = 2;
@CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "作物面积", checkRank = 3)
public String y;
@CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "行距", checkRank = 2)
public Long z = 06l;
@CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "株距", checkRank = 4)
public Short a;
@CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "有机质", checkRank = 5)
public Byte b;
@CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "fe", checkRank = 6)
public char c;
@CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "zn", checkRank = 7)
public double d;
@CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "b", checkRank = 8)
public float e;
@CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "si", checkRank = 9)
public boolean f;
@CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "ca", checkRank = 10)
public List<String> list = new ArrayList<>();
@CheckAdapt(checkType = ParamCheckType.EMPTY_AND_ZERO_CHECK, paramsName = "mg", checkRank = 11)
public List<Deep> mgs = new ArrayList<>();
}
4.所需其它类
public interface ParamCheckType {
/**
* 非空校验
*/
int EMPTY_CHECK = 0;
/**
* 非空+非0校验
*/
int EMPTY_AND_ZERO_CHECK = 1;
/**
* 非零检测校验
*/
int ZERO_CHECK = 2;
String NO_EMPTY = "不能为空";
String NO_ZERO = "不能为0";
int ZERO = 0;
}
}
public static class Deep implements DeepCheck {
public int type;
@Override
public int getType() {
return type;
}
@Override
public String text() {
return "";
}
public Deep(int type) {
this.type = type;
}
@Override
public String[] getTypeValues() {
return new String[]{"key1", "key2", "key3"};
}
}
public class Tools{
public static final String NULL_VALUE = "null";
/**
* 非空判断
*/
public static boolean isEmpty(CharSequence str) {
if ((str + "").equalsIgnoreCase(NULL_VALUE)) {
return true;
}
return isEmptys(str);
}
public static boolean isEmptys(CharSequence str) {
return str == null || str.length() == 0;
}
}
/**
* 深检测
*/
public interface DeepCheck {
int getType();
String text();
String[] getTypeValues();
}
调用示例(非零,非空,非零加非空校验)
{
try {
Tst tst = new Tst();
new IParseAdaptImpl().parse(tst); // 校验核心逻辑
// 发起http请求
} catch (Exception e) {
e.printStackTrace();
if (e instanceof IException) {
ToastUtil.debug(e.getMessage());
}
}
}
// 测试用例,期望结果
http.ex.IException: 作物面积不能为空
at http.tag.IParseAdaptImpl.parse(IParseAdaptImpl.java:167)
at http.tag.IParseAdaptImpl.parse(IParseAdaptImpl.java:84)
网友评论