Estou com uma certa dificuldade para entender em qual momento de um projeto isso pode se encaixar.
Estou com uma certa dificuldade para entender em qual momento de um projeto isso pode se encaixar.
Oi Mário, Tudo bem? Existem vários cenários onde um método estático ou atributo estático pode fazer sentido. Imagine por exemplo uma classe de validação de CPF, você criaria uma classe para não deixar que essa função fique solta em um arquivo qualquer, além de que você pode fazer outras operações com CPF além de validar.
Agora, faz sentido instanciar essa classe sempre que for preciso, talvez sim, mas em muitos casos, como é apenas uma operação simples, você pode deixar estático e utilizar esse método direto sem precisar de instâncias. Entende?
É comum que classes auxiliares, também conhecidas como helpers, tenham método estáticos. O Laravel é cheio desses exemplos. A classe que lê e escreve arquivos no disco por exemplo, tem uma série de métodos estáticos.
Ainda nesse exemplo, se você salva todos os arquivos em um único lugar, você pode deixar o atributo dessa classe auxiliar que armazena o lugar onde os arquivos serão salvos em um atributo estático. Isso por que o lugar será o mesmo pra todo mundo.
Esse exemplos podem ser feitos também sem ser estáticos, claro! Conseguiu observar onde pode haver aplicação pra isso?
Simples, imagine o seguinte. Você possui um banco de dados que armazena o CPF apenas números:
Nome | CPF |
Márcio | 12345678901|
Mario | 31264597825|
Julio | 59753456852|
Porém você quer a formatação padrão, ou seja.
123.456.753-01
Por um pedido do seu administrador de db, você não pôde armazenar esses valores direto com a formatação no banco.
Para realizar essa formatação, você obviamente necessita de um código para colocar a regra dessa formatação, como existe um paradigma com OO isto deve ser um helper e por questões de otimização uma classe estática.
Exemplo:
Se fosse uma classe comum:
let instanciaHelper = new helper();
console.log(instanciaHelper.formatCpf(usuario.cpf));
Este código faz com que você instancia um helper para isso.
Já com classes estáticas:
console.log(helper.formatCpf(usuario.cpf));
Classes estáticas não precisam ser instanciadas para a utilização do código que ela possui.
Já atributos estáticos funcionam como "escopos globais", digamos que você deseja saber quantas instancias foram feitas de uma determinada classe, logo você possui o seguinte código:
public class usuario{
static int qntInstancias;
public string cpf;
public string nome;
public usuario(){
usuario.qntInstancias++;
}
}
Ou seja, sempre que uma nova instância de usuário for instanciada na aplicação o atributo qntInstancias somará mais 1.
Lembre-se: classes estáticas não podem ser acompanhadas de 'this', O this requer u objeto para ser referenciado.
Espero que tenha lhe ajudado!
Então o método estático faz parte da classe mas não utiliza dos seus recursos? está ali somente por semântica realizando um tarefa espeficia, relacionada ao objeto? que por sua vez acaba perdendo o sentido instanciar a classe para utilizá-lo, desnecessário. Seria algo mais ou menos nessa linha? no caso de motodos que utilizam dos recursos da classe, por exemplo que precisa de acessar um atributo pra executar sua tarefa, já não seria considerado estático né? Ou não tem nada a ver ?
"Então o método estático faz parte da classe mas não utiliza dos seus recursos?"
Sim, até hoje, não vi nenhuma linguagem onde a classe estática utiliza dos recursos do objeto(a não ser que este recurso também seja estático).
"está ali somente por semântica realizando um tarefa espeficia, relacionada ao objeto?"
Sim, mas não diria "só por semântica", pois você como programador recebendo essa ferramenta sabendo usá-la se torna uma ferramenta poderosíssima, mas infelizmente é um caminho de duas vias.
"no caso de métodos que utilizam dos recursos da classe, por exemplo que precisa de acessar um atributo pra executar sua tarefa, já não seria considerado estático né? Ou não tem nada a ver ?"
Sim, se você necessita acessar um recurso da classe, a menos que este recurso seja estático, é necessário haver uma instância da classe.
Gente, só esclarecendo uma coisa. A classe é apenas um "documento descritivo" de como um objeto se comporta, ela não tem "recursos".
Método estáticos podem sim usar "recursos" dos objetos, mas isso muda a forma como você escreve o método. As vezes você escreverá um método estático justamente por que o comportamento daquele método não muda de acordo com o estado do objeto, talvez por que a operação não dependa diretamente do objeto para fazer sentido.
Lembrando que, muitos dos recursos que a gente pensa, podem variar na escrita do código dependendo da linguagem. Por exemplo: Em PHP, Ruby, JavaScript e outras linguagens, você não precisa necessariamente criar uma classe (*Ruby é um pouco diferente por baixo dos panos mas a ideia é válida) para poder escrever um código independente de classe (validaCPF pode ser uma função em todas essas linguagens em um arquivo separado) porém, em Java, por exemplo, a unidade mínima de código é a classe, então no Java, você escreveria uma classe de um método.
Analisar todas essas características parece complicado, mas no final das contas é só pensar um pouco se faz sentido e qual o impacto de ter esse método estático. No geral, métodos estáticos são pouco utilizados em relação aos não estáticos por que na maior parte do tempo, você estará escrevendo código que depende das características do objeto em questão.