我已经完成了检查密码符合各种业务规则的基本功能。有一个大写字符,有一个数字等。
我想通过根据需要打开和关闭这些选项来使此功能更灵活和可配置。我能想到的唯一方法就是:
public static boolean isPasswordValid(String pwd, boolean checkUpper, boolean checkLower, boolean checkNum) {
boolean hasUppercase = !pwd.equals(pwd.toLowerCase(Locale.getDefault()));
boolean hasLowercase = !pwd.equals(pwd.toUpperCase(Locale.getDefault()));
boolean hasNumeric = pwd.matches(".*\\d+.*");
boolean isValid = false;
if(checkUpper){
if(hasUppercase) {
isValid = true;
}else{
return isValid;
}
}
return isValid;
}
我觉得有一种更好的方法,使用Enums或其他东西。我希望能够传递密码和一个额外的参数作为标志来启用各种检查。随着时间的推移,我不可避免地需要增加更多。
如果我使用枚举,按照我的思维方式,我必须为每种可能的情况定义一个eNum。即upper,upper_and_lower,upper_and_numeric。如果我必须添加更多选项,那将变得非常复杂。
任何意见和建议都会受到欢迎。感谢。
答案 0 :(得分:2)
您可以使用EnumSet,它是枚举的专用集。
public static enum Validation {
UPPER, LOWER, DIGIT //etc.
}
public static boolean isPasswordValid(String pwd, EnumSet<Validation> validations) {
//...
}
然后,您可以通过向集合添加必要的值来使用任何验证组合。例如:
EnumSet<Validation> validation = EnumSet.of(Validation.UPPER, Validation.LOWER);
if (isPasswordValid(pass, validation)) {
//...
}
答案 1 :(得分:0)
使用方法链非常简单但非常灵活:
public abstract class Clause {
public abstract boolean match(string value);
}
public final class UpperCaseClause extends Clause {
@Override
public boolean match(string value) {
return !value.equals(value.toLowerCase(Locale.getDefault()));
}
}
public final class LowerCaseClause extends Clause {
@Override
public override boolean match(string value) {
return !value.equals(value.toUpperCase(Locale.getDefault()));
}
}
public final class NumericClause extends Clause {
@Override
public override boolean match(string value) {
return value.matches(".*\\d+.*");
}
}
public final class Validator {
private List<Clause> clauses;
public Validator() {
clauses = new ArrayList<Clause>();
}
public Validator addClause(Clause toAdd) {
clauses.add(toAdd);
return this;
}
public boolean valid(string value) {
boolean isValid = true;
for(clause in clauses) {
isValid &= clause.match(value);
if (!isValid) {
break;
}
}
return isValid;
}
}
[... you could create this anywhere and cache it]
Validator allValidator = new Validator().addClause(new UpperCaseClause())
.addClause(new LowerCaseClause())
.addClause(new NumericClause());
[...]
public static boolean isPasswordValid(String pwd, Validator validator) {
validator.valid(pwd);
}
[... then pass in the validator you wish to use]
isPasswordValid(pwd, allValidator);
[...]
答案 2 :(得分:0)
您可以使用regex:
执行此操作^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$
您使用所有三种组合(数字,大写,小写字母)验证密码
String pwd = "aaaaaaabbbbCCCC43333333222111";
if (pwd.matches("^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).*$")) {
System.out.println("It has all three combinations");
} else {
System.out.println("Invalid password");
}
Output:
It has all three combinations