Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我将如何浓缩这些方法?_Java - Fatal编程技术网

Java 我将如何浓缩这些方法?

Java 我将如何浓缩这些方法?,java,Java,我不知道如何用一个isValidPassword方法解决这个问题,所以我把它分成3个部分,让它工作起来。有人能告诉我如何使用我写的代码吗?如果可能的话,可以把它浓缩一下吗 创建程序密码,提示用户输入密码并确定密码是否有效。应该有一个静态方法isValidPassword,用于验证密码(字符串)并返回true或false。用户只有三次尝试输入有效密码。 有效密码遵循以下三条规则: - Must have at least eight characters. - Must contain ONLY

我不知道如何用一个
isValidPassword
方法解决这个问题,所以我把它分成3个部分,让它工作起来。有人能告诉我如何使用我写的代码吗?如果可能的话,可以把它浓缩一下吗

创建程序密码,提示用户输入密码并确定密码是否有效。应该有一个静态方法
isValidPassword
,用于验证密码(字符串)并返回true或false。用户只有三次尝试输入有效密码。 有效密码遵循以下三条规则:

- Must have at least eight characters.
- Must contain ONLY letters and digits.
- Must contain at least two digits.
为程序使用对话框。您必须为此程序使用字符串和字符类。您不能使用正则表达式。这个程序只需要运行一次

import javax.swing.JOptionPane;

public class Password {

    public static void main(String[] args) {

        int retryCount = 0;

        while (retryCount < 3) {

            retryCount++;

            String password = JOptionPane.showInputDialog("Please Enter the Password");
            if (CheckPassword(password)) {
                JOptionPane.showMessageDialog(null, "Congrats! Correct Password!");
                break;
            }
            else {

                JOptionPane.showMessageDialog(null, "Sorry, Invalid Password, you tried " + retryCount + " times");

                continue;
            }
        }
    }

    public static boolean CheckPassword(String password) {

        if (password.length() >= 8 & CheckAlphanumeric(password) && Check2digits(password)) {
            return true;
        }
        else {
            return false;
        }

    }

    public static boolean CheckAlphanumeric(String string) {

        for (int i = 0; i < string.length(); i++) {
            char x = string.charAt(i);
            if (x < 0x30 || (x >= 0x3a && x <= 0x40) || (x > 0x5a && x <= 0x60) || x > 0x7a) {
                return false;
            }
        }
        return true;
    }

    public static boolean Check2digits(String string) {

        int count = 0;
        for (int i = 0; i < string.length(); i++) {

            char c = string.charAt(i);
            if (Character.isDigit(c)) {
                count++;
            }

            if (count > 2) {
                return true;
            }

        }
        return false;
    }
}
import javax.swing.JOptionPane;
公共类密码{
公共静态void main(字符串[]args){
int retryCount=0;
while(retryCount<3){
retryCount++;
String password=JOptionPane.showInputDialog(“请输入密码”);
如果(检查密码(密码)){
showMessageDialog(null,“恭喜!密码正确!”);
打破
}
否则{
showMessageDialog(null,“对不起,密码无效,您尝试了”+retryCount+“次”);
继续;
}
}
}
公共静态布尔校验密码(字符串密码){
if(password.length()>=8&检查字母数字(密码)和检查2数字(密码)){
返回true;
}
否则{
返回false;
}
}
公共静态布尔校验字母数字(字符串){
对于(int i=0;i=0x3a&&x0x5a&&x0x7a){
返回false;
}
}
返回true;
}
公共静态布尔Check2digits(字符串){
整数计数=0;
对于(int i=0;i2){
返回true;
}
}
返回false;
}
}

让我们快速回顾一下代码:

  • 阅读java命名约定。方法名大小写相同;返回布尔值的东西应该命名为
    isPasswordValid()
  • 您在这里所做的实际上是一种很好的方法:您应该更喜欢许多小方法(具有很好的有意义的名称!),而不是一些大方法(其背后的东西称为“单层抽象”原则)
  • 您可以阅读有关正则表达式的内容,以便进行大部分检查;尤其是检查“仅限ascii字符”是一个很好的选择!因此,即使您的作业中说“不要使用它们”;您可能想学习如何使用它们。只是为了您自己的学习进度!但是正如Kayaman指出的,该类有许多用于此类检查的静态帮助器方法;因此不需要手动实现所有这些
  • 您的代码“逻辑不一致”。如果某些字符串符合某些密码规则(最小长度、最小位数),则您的代码正在验证。但您的消息暗示此代码正在检查提供的密码是否正确。;如:用户输入其密码,然后代码检查该密码是否已知并与以前存储的密码匹配。从这个意义上说:确保消息和代码内容一致
除此之外,还有一个建议,建议如何增强“真实世界”使用的设计。问题是:可以有许多不同的规则使密码有效。这些规则可能会随着时间的推移而改变。通常,您希望告诉用户他的输入与哪些规则相冲突。解决这些问题的一个选项是:

public interface PasswordValidator {
  public void checkPassword(String password) throws InvalidPasswordException;
}
然后创建各种实现,例如

public class MinimumLengthValidator implements PasswordValidator {
  @Override
  public void checkPassword(String password) throws   InvalidPasswordException {
    if (password.lenght() < 8) {
      throw new InvalidPasswordException("Given password is not long enough; expecting at least 8 characters");
    }
  }
公共类最小长度验证器实现密码验证器{
@凌驾
public void checkPassword(字符串密码)引发InvalidPasswordException{
if(password.lenght()<8){
抛出新的InvalidPasswordException(“给定的密码不够长;至少需要8个字符”);
}
}
然后,您创建这些不同验证程序类的实例;并将它们存储在某个数组中。您迭代该数组,并单独调用每个验证;当验证失败时,您会直接收到一个异常,并为用户提供一条好消息


如上所述:以上内容仅表示灵感(并且只是打印下来,所以要小心打字错误)。

让我们快速回顾一下代码:

  • 阅读java命名约定。方法名大小写相同;返回布尔值的东西应该命名为
    isPasswordValid()
  • 您在这里所做的实际上是一种很好的方法:您应该更喜欢许多小方法(具有很好的有意义的名称!),而不是一些大方法(其背后的东西称为“单层抽象”原则)
  • 您可以阅读有关正则表达式的内容,以便进行大部分检查;尤其是检查“仅限ascii字符”是一个很好的选择!因此,即使您的作业中说“不要使用它们”;您可能想学习如何使用它们。只是为了您自己的学习进度!但是正如Kayaman指出的,该类有许多用于此类检查的静态帮助器方法;因此不需要手动实现所有这些
  • 您的代码“逻辑不一致”。您的代码正在验证某个字符串是否符合某些密码规则(最小长度、最小位数)。但您的消息暗示此代码正在检查提供的密码是否正确;如:用户输入其密码,然后
    public class Demo {
    
        private final int passwordAttempts = 3;
        private int countAttempts = 0;
        private String password;
        private int digitCounter = 0;
    
        public Demo() {
            init();
        }
    
        public static void main(String[] args) {
            new Demo();
        }
    
        private String checkPassword(String pass) {
            if (pass.length() >= 8) {
                if (StringUtils.isAlphanumeric(pass)) {
                    char[] toCharArray = pass.toCharArray();
                    for (int i = 0; i < toCharArray.length; i++) {
                        char check = toCharArray[i];
                        if(Character.isDigit(check)){
                            digitCounter++;
                        }
                    }
                    if (digitCounter >= 1) {
                        return "success";
                    }else{
                        return "digit";
                    }
                }else{
                    return "alphanumeric";
                }
            }else{
                return "length";
            }
        }
    
        private void init() {
            while (countAttempts < passwordAttempts) {
               password = JOptionPane.showInputDialog("Please Enter the Password");
               digitCounter = 0;
               String passwordResult = checkPassword(password);
               if (passwordResult.equals("success")) {
                  JOptionPane.showInputDialog("yes you entered correct password...");
               } else if(passwordResult.equals("length")){
                  JOptionPane.showInputDialog("password must contain atleast 8 characters...");
               }else if(passwordResult.equals("alphanumeric")){
                  JOptionPane.showInputDialog("only alphanumeric password accept...");
               }else if(passwordResult.equals("digit")){
                  JOptionPane.showInputDialog("password must contain atleast two digits...");
               }
              countAttempts++;
            }
        }
    }
    
    <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.0</version>
    </dependency>