Uma regra prática: pergunte a si mesmo "Faz sentido chamar esse método, mesmo que nenhum objeto tenha sido construído ainda?" Nesse caso, deve ser definitivamente estático.
Portanto, em uma classe, Car
você pode ter um método:
double convertMpgToKpl(double mpg)
... o que seria estático, porque é possível saber no que 35mpg se converte, mesmo que ninguém jamais tenha construído um Car
. Mas este método (que define a eficiência de um particular Car
):
void setMileage(double mpg)
... não pode ser estático, pois é inconcebível chamar o método antes que qualquer Car
tenha sido construído.
(A propósito, o inverso nem sempre é verdadeiro: às vezes você pode ter um método que envolve dois Car
objetos e ainda assim querer que seja estático. Por exemplo:
Car theMoreEfficientOf( Car c1, Car c2 )
Embora isso possa ser convertido para uma versão não estática, alguns argumentam que, como não há uma opção "privilegiada", o que Car
é mais importante, você não deve forçar um chamador a escolher um Car
como o objeto que você chamará. método ativado. Essa situação é responsável por uma fração bastante pequena de todos os métodos estáticos.)
Car#isMoreEfficientThan(Car)
. Tem a vantagem de que carro que você devolve em um empate não é arbitrário. É óbvio pelo título do método o que é retornado em um empate.Defina métodos estáticos apenas nos seguintes cenários:
fonte
Existem alguns motivos válidos para usar métodos estáticos:
Desempenho : se você deseja que algum código seja executado e não instancia um objeto extra para fazê-lo, coloque-o em um método estático. A JVM também pode otimizar muito os métodos estáticos (acho que já li James Gosling declarando que você não precisa de instruções personalizadas na JVM, pois os métodos estáticos serão tão rápidos, mas não conseguem encontrar a fonte - portanto pode ser completamente falso). Sim, é micro-otimização e provavelmente desnecessário. E nós programadores nunca fazemos coisas desnecessárias só porque são legais, certo?
Praticidade : em vez de ligar
new Util().method(arg)
, ligarUtil.method(arg)
oumethod(arg)
com importações estáticas. Mais fácil, mais curto.Adicionando métodos : você realmente queria que a classe String tivesse um
removeSpecialChars()
método de instância, mas não existe (e não deveria, pois os caracteres especiais do seu projeto podem ser diferentes dos do outro) e não pode ser adicionado (desde Java é um pouco sensato), então você cria uma classe de utilitário e chama emremoveSpecialChars(s)
vez des.removeSpecialChars()
. Doce.Pureza : tomando algumas precauções, seu método estático será uma função pura , ou seja, a única coisa de que depende são seus parâmetros. Entrada de dados, saída de dados. Isso é mais fácil de ler e depurar, pois você não precisa se preocupar com peculiaridades de herança. Você também pode fazer isso com métodos de instância, mas o compilador o ajudará um pouco mais com métodos estáticos (não permitindo referências a atributos de instância, substituindo métodos etc.).
Você também precisará criar um método estático se quiser criar um singleton, mas ... não. Quero dizer, pense duas vezes.
Agora, mais importante, por que você não gostaria de criar um método estático? Basicamente, o polimorfismo sai da janela . Você não poderá substituir o método
nem declará-lo em uma interface(pré-Java 8) . É preciso muita flexibilidade do seu design. Além disso, se precisar de estado , você terá muitos bugs de concorrência e / ou gargalos, se não for cuidadoso.fonte
Depois de ler os artigos de Misko, acredito que os métodos estáticos são ruins do ponto de vista de teste. Você deve ter fábricas (talvez usando uma ferramenta de injeção de dependência como o Guice ).
como posso garantir que tenho apenas algo
O problema básico dos métodos estáticos é que eles são código processual
fonte
Math.abs()
ouArrays.sort()
, mesmo métodos nos quais você pode passar todas as dependências , não vejo como isso impediria o teste de unidade. Eu diria que uma regra simples é: se você tiver algum motivo para zombar da lógica processual, não a coloque em um método estático. Eu nunca tive um motivo para zombarArrays.sort()
ouMath.abs()
.Um
static
método é um tipo de método que não precisa que nenhum objeto seja inicializado para ser chamado. Você notou questatic
é usado namain
função em Java? A execução do programa começa a partir daí sem a criação de um objeto.Considere o seguinte exemplo:
fonte
Métodos estáticos em java pertencem à classe (não uma instância dela). Eles não usam variáveis de instância e geralmente recebem informações dos parâmetros, executam ações e retornam algum resultado. Os métodos de instâncias estão associados a objetos e, como o nome indica, podem usar variáveis de instância.
fonte
Não, métodos estáticos não estão associados a uma instância; eles pertencem à classe. Métodos estáticos são seu segundo exemplo; Os métodos de instância são os primeiros.
fonte
Se você aplicar uma palavra-chave estática a qualquer método, ela será conhecida como método estático.
// Programa de alteração da propriedade comum de todos os objetos (campo estático).
O / P: 111 BBDIT indiano 222 BBDIT americano 333 China BBDIT
fonte
Os métodos estáticos não estão associados a uma instância, portanto, eles não podem acessar nenhum campo não estático na classe.
Você usaria um método estático se o método não usar nenhum campo (ou apenas campos estáticos) de uma classe.
Se qualquer campo não estático de uma classe for usado, você deverá usar um método não estático.
fonte
Os métodos estáticos devem ser chamados na classe, os métodos de instância devem ser chamados nas instâncias da classe. Mas o que isso significa na realidade? Aqui está um exemplo útil:
Uma classe de carro pode ter um método de instância chamado Accelerate (). Você só pode acelerar um carro, se o carro realmente existir (foi construído) e, portanto, esse seria um método de instância.
Uma classe de carro também pode ter um método de contagem chamado GetCarCount (). Isso retornaria o número total de carros criados (ou construídos). Se nenhum carro foi construído, esse método retornaria 0, mas ainda assim poderia ser chamado e, portanto, teria que ser um método estático.
fonte
Na verdade, usamos propriedades e métodos estáticos em uma classe, quando queremos usar alguma parte do nosso programa que deve existir lá até que o programa esteja em execução. E sabemos que, para manipular propriedades estáticas, precisamos de métodos estáticos, pois eles não fazem parte da variável de instância. E sem métodos estáticos, manipular propriedades estáticas é demorado.
fonte
Use um método estático quando desejar acessar o método sem uma instância da classe.
fonte
Estático:
Obj.someMethod
Use
static
quando desejar fornecer acesso no nível de classe a um método, ou seja, onde o método deve ser chamado sem uma instância da classe.fonte
Os métodos estáticos não precisam ser invocados no objeto e é quando você o utiliza. Exemplo: seu Main () é estático e você não cria um objeto para chamá-lo.
fonte
Métodos e variáveis estáticas são uma versão controlada das funções e variáveis 'Globais' em Java. Em que métodos podem ser acessados como
classname.methodName()
ouclassInstanceName.methodName()
, ou seja, métodos e variáveis estáticos podem ser acessados usando o nome da classe, bem como instâncias da classe.A classe não pode ser declarada como estática (porque não faz sentido. Se uma classe é declarada pública, pode ser acessada de qualquer lugar), as classes internas podem ser declaradas estáticas.
fonte
Métodos estáticos podem ser usados se
Não se deseja executar uma ação em uma instância (métodos utilitários)
Alguém quer usar como uma função simples. As entradas são explicitamente transmitidas e obtêm os dados do resultado como valor de retorno. Herança, a instanciação do objeto não entra em cena. Conciso, legível .
NOTA : Poucas pessoas argumentam contra a testabilidade de métodos estáticos, mas eles também podem ser testados! Com o jMockit, é possível zombar de métodos estáticos. Testabilidade . Exemplo abaixo:
fonte
Métodos estáticos são os métodos em Java que podem ser chamados sem criar um objeto de classe. É pertencer à classe.
Usamos o método estático quando não precisamos ser chamados pelo método instance.
fonte
static
métodos é acessarstatic
campos.Mas você pode ter
static
métodos, sem referenciarstatic
variáveis. Métodos auxiliares sem referenciarstatic
variável podem ser encontrados em algumas classes java como java.lang.MathNo outro caso de uso, posso pensar nesses métodos combinados com o
synchronized
método é a implementação do bloqueio no nível de classe no ambiente multiencadeado.Se você precisar acessar o método em um objeto de instância da classe, seu método deverá ser não estático.
A página de documentação do Oracle fornece mais detalhes.
Nem todas as combinações de variáveis e métodos de instância e classe são permitidas:
fonte
A common use for static methods is to access static fields.
não é um argumento.Um método estático tem dois objetivos principais:
fonte
No eclipse, você pode ativar um aviso que ajuda a detectar possíveis métodos estáticos. (Acima da linha destacada há outra que eu esqueci de destacar)
fonte
Sempre que você não desejar criar um objeto para chamar um método no seu código, apenas declare esse método como estático. Como o método estático não precisa de uma instância para ser chamada, mas a captura aqui nem todos os métodos estáticos são chamados pela JVM automaticamente. Esse privilégio é usufruído apenas pelo método main () "public static void main [String ... args]" em java porque, em tempo de execução, esse é o método Signature public "static" void main [] procurado pela JVM como um ponto de entrada para inicia a execução do código.
Exemplo:
Saída: - Este método estático é executado pela JVM Este método estático precisa ser chamado explicitamente Este método estático precisa ser chamado explicitamente Este método estático precisa ser chamado explicitamente
fonte