Por que haveria uma vantagem em usar um método estático e passar a referência a um objeto como parâmetro, em vez de chamar o método em um objeto?
Para esclarecer o que quero dizer, considere a seguinte classe:
public class SomeClass {
private double someValue;
public SomeClass() {
// Some constructor in which someValue is set
}
public void incrementValue() {
someValue++;
}
}
Comparado a esta implementação alternativa com um método estático:
public class SomeClass {
private double someValue;
public SomeClass() {
// Some constructor in which someValue is set
}
public static void incrementValue(SomeClass obj) {
obj.someValue++;
}
}
Minha pergunta não está restrita apenas a essa classe; qualquer ponto em que você passe um objeto em vez de chamá-lo em um método é o que me interessa. Isso é sempre vantajoso? Se sim, por quê?
java
object-oriented
static-methods
Addison Crump
fonte
fonte
Respostas:
Um exemplo trivial: quando a instância passada pode legitimamente ser nula e você deseja incorporar o tratamento (não trivial) disso ao método.
fonte
No seu exemplo, o método da instância é um vencedor claro.
No caso geral, posso pensar em algumas razões pelas quais um método estático pode ser apropriado:
Você deseja colocar o método estático em outra classe, pois há uma situação em que faz sentido separar a lógica dos dados (nota: seu exemplo não é um deles).
Você está passando dois ou mais objetos e deseja enfatizar que eles são de igual importância.
null
é um valor válido (conforme explicado pelo usuário 9000).fonte
Seria sensato incluir os métodos que alteram o estado do objeto como métodos de instância , e não como método estático .
No entanto, podemos encontrar exemplos de métodos estáticos que são
pure
métodos e tomam o objeto como entrada, como quando precisamos instanciar o objeto com base em certas regras de validação. Por exemplo, o .NET possui o métodoDateTime.TryParse(String s, DateTime d)
para validar e instanciar o objeto. Mas o parâmetroDateTime d
está explicitamente marcado comoout
.Outro caso pode ser quando comparamos os objetos e queremos obter o objeto desejado como valor de retorno, em vez de um valor booleano / inteiro do resultado da comparação, por exemplo
Team.GetHigherScorer(teamA, teamB).IncreaseRanking()
. Isso será mais limpo do que:(deixando o caso "empate" por simplicidade).
fonte
out
é uma.Net
palavra - chave usada como um modificador de parâmetro. Ele afirma que o parâmetro é passado por referência. Veja para mais detalhes msdn.microsoft.com/en-us/library/t3c3bfhx.aspxclass C { int x; static void M() {
então M é perfeitamente capaz de acessarx
. Por exemplo,int y = (new C()).x;
é legal.static void M() { this.x = 1; }
não é possível.this.x
está errado não porquex
não pode ser acessado, mas porquethis
não existe. Não é uma questão de acesso , é uma questão de existência .A injeção de dependência seria um bom motivo para executar a chamada para o método estático. Supondo que a implementação concreta de
SomeClass
tenha uma cadeia de herança ou seja a implementação de outra classe. Você pode usar uma simulação de um objeto, passá-lo para fins de teste para garantir que seu método faça o que deveria e, em seguida, informar sobre esse status.fonte