具有切换选项的功能

时间:2015-02-25 10:57:59

标签: java enums

我已经完成了检查密码符合各种业务规则的基本功能。有一个大写字符,有一个数字等。

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

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。如果我必须添加更多选项,那将变得非常复杂。

任何意见和建议都会受到欢迎。感谢。

3 个答案:

答案 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