Usar ou não métodos e atributos estaticos

-> Ola, tenho esta classe em Java e não estou instanciando mais nenhum objeto além do objeto da classe Scanner, nesta classe seria mais correto os métodos e atributos serem estáticos ou não-estáticos?

public class TelaLogin implements Visualizavel {

        Scanner scan = new Scanner(System.in);
        private boolean voltar_tela_principal = false;
        private String novo_login;
        private String nova_senha;
        

        protected boolean showLoginScreen(ResourceBundle traducao, LoginUsuario login, boolean pt_BR, boolean loginUsuario) {
            String temCadastro;
            System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>");
            System.out.println();
            System.out.println("* " + traducao.getString("pergunta.tem.cadastro") + " *");
            System.out.println();
            System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<");
            System.out.print("-> ");
            temCadastro = login.verificarDigito(pt_BR);
            System.out.println("===========================");
            System.out.println();

            if ("S".equals(temCadastro) || "Y".equals(temCadastro)) {
                do {
                    System.out.println("------------- Login -------------");
                    System.out.println();
                    System.out.print("-> login: ");
                    String loginEntrar = this.scan.next();
                    System.out.println();
                    System.out.print("-> " + traducao.getString("senha") + ": ");
                    String senhaEntrar = this.scan.next();
                    System.out.println();
                    System.out.println();
                    System.out.println("=================================");
                    loginUsuario = login.verificarLogin(loginEntrar, senhaEntrar);
                    if (loginUsuario == false) {
                        System.out.println("# Login " + traducao.getString("invalido") + " #");
                    }
                } while (loginUsuario != true);
                System.out.println();
                return true;
            } else {
                String loginCadastro;
                String senhaCadastro;
                System.out.println("------------- " + traducao.getString("cadastro") + " -------------");
                System.out.println();
                System.out.print("-> Login: ");
                loginCadastro = this.scan.next();
                System.out.println();
                System.out.print("-> " + traducao.getString("senha") + ": ");
                senhaCadastro = this.scan.next();
                System.out.println();
                System.out.println();
                System.out.println("====================================");
                login.cadastrarUsuario(loginCadastro, senhaCadastro);
                System.out.println("''''''''''''''''''''''''''");
                System.out.println("*¨ " + traducao.getString("usuario.cad") + " ¨*");
                System.out.println("''''''''''''''''''''''''''");
                return true;
            }
        }

        public void telaModificarLogins(ResourceBundle traducao, LoginUsuario loginUsuario) {
            System.out.println("----------------- " + traducao.getString("alterar.cadastro") + " -----------------");
            System.out.println("1 - " + traducao.getString("modificar.login"));
            System.out.println("2 - " + traducao.getString("modificar.senha"));
            System.out.println("3 - " + traducao.getString("voltar"));
            System.out.print("-> ");
            int resposta = this.scan.nextInt();
            while (resposta != 1 && resposta != 2 && resposta != 3) {
                System.out.print("-> ");
                resposta = this.scan.nextInt();
            }
            switch (resposta) {
                case 1:
                    this.modificarLogin_Dialogos(traducao, loginUsuario);
                    System.out.print("-> " + traducao.getString("digite.novo.login") + ": ");
                    this.novo_login = this.scan.next();
                    loginUsuario.setLoginUser(this.novo_login);
                    this.voltar_tela_principal = true;
                    System.out.println("'''''''''''''''''''''''''''''''");
                    System.out.println("*¨ "+traducao.getString("seu.login.agora.e")+" '"+this.novo_login+"' ¨*");
                    System.out.println("'''''''''''''''''''''''''''''''");
                    break;
                case 2:
                    this.modificarLogin_Dialogos(traducao, loginUsuario);
                    System.out.print("-> " + traducao.getString("digite.nova.senha") + ": ");
                    this.nova_senha = this.scan.next();
                    System.out.print("-> " + traducao.getString("repita.senha") + ": ");
                    String repita_nova_senha = this.scan.next();
                    while (!this.nova_senha.equals(repita_nova_senha)) {
                        System.out.print("-> " + traducao.getString("digite.nova.senha") + ": ");
                        this.nova_senha = this.scan.next();
                        System.out.print("-> " + traducao.getString("repita.senha") + ": ");
                        repita_nova_senha = this.scan.next();
                    }
                    loginUsuario.setSenhaUser(this.nova_senha);
                    this.voltar_tela_principal = true;
                    System.out.println("'''''''''''''''''''''''''''''''");
                    System.out.println("*¨ "+traducao.getString("sua.senha.agora.e")+" '"+this.nova_senha+"' ¨*");
                    System.out.println("'''''''''''''''''''''''''''''''");
                    break;
                case 3:
                    this.voltar_tela_principal = true;
                    break;
                default:
                    break;
            }
            System.out.println("==========================================================");
        }

        private void modificarLogin_Dialogos(ResourceBundle traducao, LoginUsuario loginUsuario) {
            System.out.println("*¨ " + traducao.getString("para.mudar.login.etc") + " ¨*");
            System.out.print("-> " + traducao.getString("login.atual") + ": ");
            String login = this.scan.next();
            System.out.print("-> " + traducao.getString("senha.atual") + ": ");
            String senha = this.scan.next();
            boolean login_certo = loginUsuario.verificarLogin(login, senha);
            while (login_certo == false) {
                System.out.println("# Login " + traducao.getString("invalido") + " #");
                System.out.println("*¨ " + traducao.getString("para.mudar.login.etc") + " ¨*");
                System.out.print("-> " + traducao.getString("login.atual") + ": ");
                login = this.scan.next();
                System.out.print("-> " + traducao.getString("senha.atual") + ": ");
                senha = this.scan.next();
                login_certo = loginUsuario.verificarLogin(login, senha);
            }
        }

        @Override
        public boolean isTelaPrincipal() {
            return voltar_tela_principal;
        }

    }

Primeiro fica a pergunta: por que você acha que algum desses métodos precisaria ser estático? O que espera obter mudando-os para estáticos?

Sem saber o que você quer, não dá pra dizer se isso seria melhor ou não.

Abraço.

1 curtida

Bom como só estou usando o método showLoginScreen em outra classe acho que seria mais correto no código os outros métodos serem static não?

digo isso pois esses outros métodos não vão ser utilizados em outras classes apenas nessa entende onde quero chegar?

Você já consegue entender a diferença entre um método/atributo estático e um método/atributo não estático? Consegue entender o que é um objeto e o que é uma classe?

Se não, continue lendo esta parte. Se sim, vá para o próximo item.
Caso você não entenda a diferença entre objeto e classe, precisamos recapitular isso.
Uma classe é um molde e as instâncias de seus objetos são elementos criados a partir desse molde.
Partindo disso, os objetos não necessitam, em primeira ordem, de nada estático, pois seus atributos e métodos garantem que eles existam de maneira independente.
Porém, a classe pode conter elementos estáticos. Estes estarão disponíveis a seus objetos e sempre manterão o mesmo valor definido na última execução/consulta (estático, entendeu?).
Há mais coisas que distinguem um objeto de uma classe, mas isso você mesmo pode pesquisar.

Um elemento estático (atributo ou método) deve ser usado sempre que o mesmo for relativo à classe em si e cujo carregamento (algo como sua existência na memória, para uso) seja necessário exatamente no momento em que a classe é carregada. É o caso do método main (assinado como public static void main(String[] args)), pois o mesmo precisa estar acessível exatamente no momento em que a classe principal (a que o contém) será chamada por um evento como um duplo clique ou uma chamada via linha de comando. A partir disso, a classe estará à disposição da JVM para execução da sequência lógica nela programada.

Agora, se você tem um método estático (como o main) e deseja referenciar algo fora deste método, será informado que este algo precisa ser, necessariamente, estático. É aí que começa a confusão.
É realmente necessário?
Sim e não.
Vamos primeiro com o não.
A classe principal (que contém o método main) deve ser única, ou seja, só devemos ter uma classe com método main no projeto todo. Ela não deveria ter outra função que não iniciar a execução da aplicação. É o princípio da responsabilidade única: cada classe existe por um só motivo e só pode executar ações inerentes a esse único motivo. Se tua classe faz mais de uma coisa, ela precisa ser dividida em duas ou mais.
Apesar disso, é comum que se ensine, num primeiro momento, a fazer tudo dentro da classe principal, como forma de agilizar o desenvolvimento de códigos (o que, na minha opinião, é um erro. Ensine da maneira certa, oras). Considerando isso, você deveria ter outra(s) classe(s) responsável(is) por implementar a solução proposta.

Agora, o sim: se você está aprendendo, é coerente manter tudo como estático.
Outro caso em que é comum colocar tudo como estático são classes utilitárias, como conversores, por exemplo. Elas concentram todos os métodos referentes a conversão de valores diversos e, por isso, utilizam-se de elementos (métodos) estáticos.
Até certo tempo, também fazia-se isso com constantes. Isso está sendo substituído por enums.

1 curtida

Conheço bem os conceitos de Classe e Objeto so tenho uma certa duvida em relação a métodos e atributos estáticos. Não sei se meu código ficaria mais correto se tudo fosse estático ou se não faria diferença. Teria como me dar um exemplo de um código que necessitaria do uso de métodos e atributos estaticos (ou que pelo menos ficaria mais correto usando eles)?

Exemplo:

É comum ter classes utilitárias com métodos estáticos, como classes para manipulação de Strings e Datas.

1 curtida

Depende