java - 从方法实例化类变量 - Java
问题描述
我知道从方法实例化类变量不是一个好主意,但不幸的是,我面临着没有其他解决方案的情况。我创建了一些自定义验证器,并且我有一个对象 ( rawField
),其中填充了来自 GUI 的一些信息。为了填充该实例变量,我使用方法 validate from javax.faces.Validator
。
因此,我通过此事件从 GUI 获取每个字段的信息。
我的问题是:这是一个好的设计模式吗?有没有人对我应该如何实例化这个变量有更好的想法?
父类:
public abstract class FormFieldValidator extends BaseValidator implements IFormFieldValidator, Validator {
protected RawField rawField;
@Override
public abstract RawField doInitialize(Object inputObject);
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
rawField = doInitialize(value);
if (rawField == null) {
throw new IllegalArgumentException("The field cannot be empty");
}
doBasicValidation();
}
}
儿童班
@FacesValidator(Constants.Validators.USERNAME_VALIDATOR)
public class UsernameValidator extends FormFieldValidator {
@Override
public RawField doInitialize(Object guiField) {
ValidationConditions validationConditions = new ValidationConditions
.Builder(Entities.ParamsSize.USERNAME_MIN_LENGTH, Entities.ParamsSize.USERNAME_MAX_LENGTH)
.setRegex(Constants.Regex.USERNAME_REGEX).setNullable(false).setUnique(true).build();
FieldDetails fieldDetails = new FieldDetails(guiField, "Username");
RawField rawField = new RawField(fieldDetails, validationConditions);
return rawField;
}
}
解决方案
用方法调用的数据填充对象不一定是反模式。您的代码中有什么不对的是方法validate
,它做的验证更多。首先它初始化变量,然后验证对象。最好将其称为类似populateAndValidate
的名称或doInitialize
从主体中删除,并确保它由客户端代码调用。字段的空检查rawField
可以是验证过程的一部分。
推荐阅读
- python - 评估变量包含 f 字符串中的数学表达式
- c# - Azure Eventhub 将数据发送到特定分区 C#
- html - 使用 JSP 将数据库中的自动增量 ID 显示到 html 文本字段中
- python - 大量小文件的 C 与 Python I/O 性能
- asp.net-core - 基于 NLog 的通用日志记录包装器?
- azure-active-directory - 如何在 Azure Active Directory 中使用 kerberos 身份验证实现单点登录
- javascript - 将 Css 应用于 Javascript 中的当前按钮单击
- objective-c - 根据索引从数组中删除对象
- java - Spring Security REST - 单元测试失败,HttpStatusCode 401 Unauthorized
- html - 如何使用 html 打开电子邮件附件