带有切换选项的功能

Function with toggle options

我做了一个基本功能来检查密码是否符合各种业务规则。有大写字符,有数字等

我想通过根据需要打开和关闭这些选项来使此功能更加灵活和可配置。我能想到的唯一方法是:

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;
}

我觉得有更好的方法,使用枚举什么的。我希望能够传递密码和一个额外的参数来充当启用各种检查的标志。随着时间的推移,我不可避免地需要添加更多内容。

如果我要使用枚举,按照我的想法,我必须为每种可能的情况定义一个 eNum。即上层,upper_and_lower,upper_and_numeric。如果我必须添加更多选项,这将变得非常复杂。

欢迎提出任何想法和建议。谢谢

不太简单,但非常灵活,使用方法链:

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);
    [...]

你可以用 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

您可以使用 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)) {
    //...
}