app第一阶段冲刺第十天
作者:@kuaiquxie
作者的github:https://github.com/bitebita
本文为作者原创,如需转载,请注明出处:https://www.cnblogs.com/dzwj/p/16196177.html
今天写数值匹配模式,然后编写相应的数值匹配模式调用文件
package com.linlang.grasharepro.utils.validation; /** * 数值匹配模式。作为配置项传递,其数据由Config来保存 */ public enum ValuePattern { Required("此为必填项目"), MaxLength("长度不能超过{0}"), MinLength("长度不能小于{0}"), RangeLength("长度必须在[{0},{1}]之间"), MaxValue("数值不能超过{0}"), MinValue("数值不能小于{0}"), RangeValue("数值必须在[{0},{1}]之间"), EqualsTo("必须输入相同内容"), NotEqualsTo("必须输入不相同内容"); private final String mDefMessage; private String mMessage; private int mMessageId = -1; private LazyLoader mLazyLoader; private ValueType mValueType; private String mMinValue; private String mMaxValue; private String mValue; private ValuePattern(String message){ mDefMessage = message; } /** * 设置懒加载接口 * @param lazyLoader 懒加载接口 * @return ValuePattern实例 */ public ValuePattern lazy(LazyLoader lazyLoader) { mLazyLoader = lazyLoader; return this; } /** * 设置第一个参数值 * @param first 数值 * @return ValuePattern */ public ValuePattern setFirstValue(double first){ enforceFloatValueType(); syncValue(first); return this; } /** * 设置第一个参数值 * @param first 数值 * @return ValuePattern */ public ValuePattern setFirstValue(long first){ enforceIntValueType(); syncValue(first); return this; } /** * 设置第二个参数值 * @param second 数值 * @return ValuePattern */ public ValuePattern setSecondValue(long second){ enforceIntValueType(); mMaxValue = String.valueOf(second); return this; } /** * 设置第二个参数值 * @param second 数值 * @return ValuePattern */ public ValuePattern setSecondValue(double second){ enforceFloatValueType(); mMaxValue = String.valueOf(second); return this; } /** * 设置第一个参数值 * @param value 数值 * @return ValuePattern */ public ValuePattern setValue(String value){ syncValue(value); mValueType = ValueType.String; return this; } /** * 设置第一个参数值 * @param value 数值 * @return ValuePattern */ public ValuePattern setValue(long value){ syncValue(value); mValueType = ValueType.Int; return this; } /** * 设置第一个参数值 * @param value 数值 * @return ValuePattern */ public ValuePattern setValue(double value){ syncValue(value); mValueType = ValueType.Float; return this; } /** * 设置提示消息内容 * @param message 消息内容 */ public ValuePattern setMessage(String message) { mMessage = message; return this; } /** * 设置提示消息内容的资源ID * @param msgId 资源ID */ public ValuePattern setMessage(int msgId){ mMessageId = msgId; return this; } String getMessage() { final String msg = mMessage == null ? mDefMessage : mMessage; mMessage = null; return msg; } int getMessageId() { final int msg = mMessageId <= 0 ? -1 : mMessageId; mMessageId = -1; return msg; } LazyLoader getLazyLoader() { final LazyLoader loader = mLazyLoader; mLazyLoader = null; return loader; } ValueType getValueType() { ValueType type = mValueType; mValueType = null; return type; } String getMinValue() { final String value = mMinValue; mMinValue = null; return value; } String getMaxValue() { final String value = mMaxValue; mMaxValue = null; return value; } String getValue() { final String value = mValue; mValue = null; return value; } private void syncValue(Object value){ mValue = String.valueOf(value); mMinValue = mValue; } private void enforceIntValueType(){ if (mValueType == null){ mValueType = ValueType.Int; }else{ if (!ValueType.Int.equals(mValueType)){ throw new IllegalArgumentException("设置的数值类型必须同为整数"); } } } private void enforceFloatValueType(){ if (mValueType == null){ mValueType = ValueType.Float; }else{ if (!ValueType.Float.equals(mValueType)) { throw new IllegalArgumentException("设置的数值类型必须同为浮点数"); } } } @Override public String toString() { return "{" + "name='" + name() + '\'' + ", messageId=" + mMessageId + ", message='" + mMessage + '\'' + ", lazyLoader=" + mLazyLoader + ", valueType=" + mValueType + ", minValue='" + mMinValue + '\'' + ", maxValue='" + mMaxValue + '\'' + ", value='" + mValue + '\'' + '}'; } }
package com.linlang.grasharepro.utils.validation; import android.content.Context; import android.text.TextUtils; import android.widget.TextView; import com.linlang.grasharepro.utils.validation.testers.AbstractValuesTester; import com.linlang.grasharepro.utils.validation.testers.EqualsToTester; import com.linlang.grasharepro.utils.validation.testers.MaxLengthTester; import com.linlang.grasharepro.utils.validation.testers.MaxValueTester; import com.linlang.grasharepro.utils.validation.testers.MinLengthTester; import com.linlang.grasharepro.utils.validation.testers.MinValueTester; import com.linlang.grasharepro.utils.validation.testers.NotEqualsToTester; import com.linlang.grasharepro.utils.validation.testers.RangeLengthTester; import com.linlang.grasharepro.utils.validation.testers.RangeValueTester; import com.linlang.grasharepro.utils.validation.testers.RequiredValueTester; /** * 输入框的匹配模式 */ final class ValuePatternInvoker extends PatternInvoker<ValuePatternMeta, ValuePattern> { private static final String TAG = "ValueInvoker"; ValuePatternInvoker(Context context, int viewId, TextView field, ValuePattern... patterns) { super(context, viewId, field); addPatterns(patterns); } @Override public Result performTest(){ final String value = input.getText().toString(); // 当输入内容为空时,如果第一个校验模式不是“Required”,则跳过后面的配置。 final ValuePatternMeta first = patterns.get(0); if (TextUtils.isEmpty(value) && !ValuePattern.Required.equals(first.pattern)){ return Result.passed(null); } final String inputKey = input.getClass().getSimpleName() + "@{" + input.getHint() + "}"; for (ValuePatternMeta meta : patterns){ meta.performLazyLoader(); final AbstractValuesTester tester = findTester(meta); final boolean passed = tester.performTest(value); if (!passed){ FireEyeEnv.verbose(TAG, "[v] Performing: passed: NO, " + inputKey + "value: " + value + ", message: " + meta.message + ", tester: " + tester.getName()); // 如果校验器发生异常,取异常消息返回 String message = tester.getExceptionMessage(); if (message == null) { message = meta.getMessage(); } return Result.reject(message, value); } else{ FireEyeEnv.verbose(TAG, "[v] Performing: passed: YES, " + inputKey + "value: " + value + ", message: " + meta.message + ", tester: " + tester.getName()); } } FireEyeEnv.log(TAG, "[D] " + inputKey + " -> passed: YES, value: " + value); return Result.passed(value); } @Override protected boolean onFilter(ValuePatternMeta meta, ValuePattern item) { if (ValuePattern.Required.equals(item)){ this.patterns.add(0, meta); return true; }else{ return false; } } @Override protected ValuePatternMeta convert(ValuePattern item) { final ValuePatternMeta meta = ValuePatternMeta.parse(item); meta.convertMessage(context); FireEyeEnv.log(TAG, "[D] Value pattern meta -> " + meta.toString()); return meta; } private AbstractValuesTester findTester(ValuePatternMeta meta){ switch (meta.pattern){ case EqualsTo: EqualsToTester equalsToTester = new EqualsToTester(); switch (meta.valueType){ case Float: equalsToTester.setFloatValue(Double.valueOf(meta.value)); break; case Int: equalsToTester.setIntValue(Long.valueOf(meta.value)); break; case String: equalsToTester.setStringValue(meta.value); break; } return equalsToTester; case NotEqualsTo: NotEqualsToTester notEqualsToTester = new NotEqualsToTester(); switch (meta.valueType){ case Float: notEqualsToTester.setFloatValue(Double.valueOf(meta.value)); break; case Int: notEqualsToTester.setIntValue(Long.valueOf(meta.value)); break; case String: notEqualsToTester.setStringValue(meta.value); break; } return notEqualsToTester; case MinLength: MinLengthTester minLengthTester = new MinLengthTester(); minLengthTester.setIntValue(Long.parseLong(meta.value)); return minLengthTester; case MaxLength: MaxLengthTester maxLengthTester = new MaxLengthTester(); maxLengthTester.setIntValue(Long.parseLong(meta.value)); return maxLengthTester; case MinValue: MinValueTester minValueTester = new MinValueTester(); minValueTester.setFloatValue(Double.valueOf(meta.value)); return minValueTester; case MaxValue: MaxValueTester maxValueTester = new MaxValueTester(); maxValueTester.setFloatValue(Double.valueOf(meta.value)); return maxValueTester; case RangeLength: RangeLengthTester rangeLengthTester = new RangeLengthTester(); rangeLengthTester.setMinIntValue(Long.parseLong(meta.minValue)); rangeLengthTester.setMaxIntValue(Long.parseLong(meta.maxValue)); return rangeLengthTester; case RangeValue: RangeValueTester rangeValueTester = new RangeValueTester(); rangeValueTester.setMinFloatValue(Double.valueOf(meta.minValue)); rangeValueTester.setMaxFloatValue(Double.valueOf(meta.maxValue)); return rangeValueTester; case Required: return new RequiredValueTester(); default: return new RequiredValueTester(){ @Override public boolean test(String content) { return false; } }; } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」