[Dúvida] Código validar CPF

Fiz um código pra validar CPF, depois vi que existem outros métodos para validação, queria ver onde posso melhorar o código, onde errei, um feedback na verdade.


package javaapplication1;

import java.util.Scanner;
import static java.lang.Math.toIntExact;

public class JavaApplication1 {

    public static void main(String args[]) {  
         
        int[] vcpf = new int[11];
         long cpf;
         long num=10000000000L;
         long resto;    
         int j;   
         int i;
         int dig1=0;
         int dig2=0; 
         
         Scanner read = new Scanner(System.in);
         cpf=read.nextLong();         
        
        //guarda cpf digitado em um vetor 
        for (j=0;j<11;j++){        
            resto= (cpf % num);
            i= toIntExact(cpf / num);
             num=num/10;
            cpf=resto;         
            vcpf[j]=i;     
        }   
        
        //soma primeiro digito
        i=10;
        for (j=0;j<9;j++){            
          dig1=dig1+(vcpf[j]*i);
          i=i-1;            
        }
       
        //soma segundo digito
        i=11;        
        for (j=0;j<10;j++){            
            dig2=dig2+(vcpf[j]*i);           
            i=i-1;
        } 
       
        //calcula digito verificador 1 e 2
        dig1= dig1*10 %11; 
        dig2= dig2*10 %11;
        //caso resultado seja 10 mudar para 0
        if (dig1==10) dig1=0;
        if (dig2==10) dig2=0;
        //verifica se o digito verificador 1 e 2 obtidos são iguais aos digitos verificadores do cpf digitado
        if (dig1==vcpf[9] && (dig2==vcpf[10]))System.out.println("CPF Válido");
        else System.out.println("CPF inválido");           
               
    }  
        
    }

vou te passar dois links:

o outro é um código “otimizado” hehe

https://www.vivaolinux.com.br/script/Codigo-para-validar-CPF-e-CNPJ-otimizado

mas tanto um quanto outro, qualquer gerador de cpf vai passar, o melhor mesmo é verificar na receita

aqui vc aprende como faz:

http://www.geradorcpf.com/algoritmo_do_cpf.htm

Para saber o que necessita, você deve estudar engenharia de software e qualidade de software.

Depende de muitos fatores e quem vai determinar isto é como dito, a Engenharia de Software.
Software funcionando não significa que o programa é adequado, ai entra a qualidade de software (subárea da engenharia de software).
Não tenho como falar muito sobre estes temas pois estou estudando estas duas disciplinas no momento e é pancadaria, mas são de importância inestimável para os projetos:
Fiz uma codificação apenas para fins de comparação, no caso a métrica de linhas, entretanto, menor quantidade de linhas não implica em um código mais eficiente, ai já é outra métrica e são muitas, mas para não falar alguma besteira sem querer quanto a métricas encerro por aqui.
Vide o código a seguir:

public static void main(String[] args) {
        int res = validarCPF(JOptionPane.showInputDialog("Informe o CPF"), true);
        JOptionPane.showMessageDialog(null, "CPF " + (res == 1 ? "válido" : res == 0 ? "inválido" : "Formato errado"));
    }
    //para iniciar a validação marque como true
    private static int validarCPF(String cpf, boolean inicio) {
        
        if (cpf.matches("\\d{11}")) {
            boolean excecao = IntStream.range(0, 9).boxed().filter(num -> (((11111111111L*num) + "").equals(cpf))).findFirst().orElse(-1) != -1;            
            int soma = 0, peso = inicio ? 10 : 11;
            //somando os digitos por um peso decrescente
            for (int i = 0; i < (inicio ? 9 : 10); i++) {
                soma += Integer.parseInt(cpf.charAt(i) + "") * peso--;
            }
            //calculando o resto
            peso = soma * 10 % 11 == 10 ? 0 : soma * 10 % 11;
            //se inicio = true a validação ocorre no index 9 do array, se não no index 11
            return excecao || !(peso + "").equals(cpf.charAt(inicio ? 9 : 10) + "") ? 0 : inicio ? validarCPF(cpf, false) : 1;
        } else {
            return 3;
        }
    }

Fonte das instruções do funcionamento da validação do CPF:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package classes;

import java.util.InputMismatchException;

/**
 *
 * @author Administrador
 */
public class ValidaCPF {
 public static boolean isCPF(String CPF) {
// considera-se erro CPF's formados por uma sequencia de numeros iguais
if (CPF.equals("00000000000") || CPF.equals("11111111111") ||
    CPF.equals("22222222222") || CPF.equals("33333333333") ||
    CPF.equals("44444444444") || CPF.equals("55555555555") ||
    CPF.equals("66666666666") || CPF.equals("77777777777") ||
    CPF.equals("88888888888") || CPF.equals("99999999999") ||
   (CPF.length() != 11))
   return(false);

char dig10, dig11;
int sm, i, r, num, peso;


try {
// Calculo do 1o. Digito Verificador
  sm = 0;
  peso = 10;
  for (i=0; i<9; i++) {              
   
    num = (int)(CPF.charAt(i) - 48); 
    sm = sm + (num * peso);
    peso = peso - 1;
  }

  r = 11 - (sm % 11);
  if ((r == 10) || (r == 11))
     dig10 = '0';
  else dig10 = (char)(r + 48); 

// Calculo do 2o. Digito Verificador
  sm = 0;
  peso = 11;
  for(i=0; i<10; i++) {
    num = (int)(CPF.charAt(i) - 48);
    sm = sm + (num * peso);
    peso = peso - 1;
  }

  r = 11 - (sm % 11);
  if ((r == 10) || (r == 11))
     dig11 = '0';
  else dig11 = (char)(r + 48);

// Verifica se os digitos calculados conferem com os digitos informados.
  if ((dig10 == CPF.charAt(9)) && (dig11 == CPF.charAt(10)))
     return(true);
  else return(false);
} catch (InputMismatchException erro) {
    return(false);
}
  }

  public static String imprimeCPF(String CPF) {
return(CPF.substring(0, 3) + "." + CPF.substring(3, 6) + "." +
  CPF.substring(6, 9) + "-" + CPF.substring(9, 11));
  }
}
1 curtida

Achei legal a verificação do digito pelo seu valor inteiro - 48.

for (int i = 0; i < 10; i++) {
            System.out.println("(int) char ["+i+"] - 48 = "+((int)(i+"").charAt(0) - 48));
        }

Você pode informar no editor qual parte de sua mensagem é codificação clicando em </>, quando estiver escrevendo uma mensagem.
Seleciona o trecho do código e clica no icone </>
Também seria interessante ter informado que a fonte do código foi um link postado por blayd2015 logo acima: http://www.devmedia.com.br/validando-o-cpf-em-uma-aplicacao-java/22097

Cara, um tempo atrás eu fiz uma POC pra validar o CPF com annotation. Se quiser dar uma olhada, o código está no meu GitHub