¿Por qué sería una ventaja usar un método estático y pasar la referencia a un objeto como parámetro en lugar de llamar al método en un objeto?
Para aclarar lo que quiero decir, considere la siguiente clase:
public class SomeClass {
private double someValue;
public SomeClass() {
// Some constructor in which someValue is set
}
public void incrementValue() {
someValue++;
}
}
En comparación con esta implementación alternativa con un 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++;
}
}
Mi pregunta no se limita solo a esta clase; cualquier punto en el que pasarías un objeto en lugar de llamarlo a un método es lo que me interesa. ¿Es esto ventajoso? Si es así, ¿por qué?
java
object-oriented
static-methods
Addison Crump
fuente
fuente
Respuestas:
Un ejemplo trivial: cuando la instancia aprobada puede ser legítimamente nula y desea incorporar el manejo (no trivial) de esto en el método.
fuente
En su ejemplo, el método de instancia es un claro ganador.
En el caso general, puedo pensar en algunas razones en las que un método estático podría ser apropiado:
Desea colocar el método estático en otra clase, ya que tiene una situación en la que tiene sentido separar la lógica de los datos (nota: su ejemplo no es uno de ellos).
Está pasando dos o más objetos y desea enfatizar que son de igual importancia.
null
es un valor válido (como lo explicó el usuario 9000).fuente
Sería conveniente incluir los métodos que cambian el estado del objeto como métodos de instancia en lugar de método estático .
Sin embargo, podemos encontrar ejemplos de métodos estáticos que son
pure
métodos y tomar el objeto como entrada, como cuando necesitamos instanciar el objeto en función de ciertas reglas de validación. Por ejemplo, .NET tiene el métodoDateTime.TryParse(String s, DateTime d)
para validar e instanciar el objeto. Pero el parámetroDateTime d
está marcado explícitamente comoout
.Otro caso puede ser cuando comparamos los objetos y queremos obtener el objeto deseado como valor de retorno en lugar de un valor booleano / entero de resultado de comparación, por ejemplo
Team.GetHigherScorer(teamA, teamB).IncreaseRanking()
,. Esto será más limpio que:(dejando el caso "dibujar" por simplicidad).
fuente
out
es una.Net
palabra clave utilizada como modificador de parámetros. Establece que el parámetro se pasa por referencia. Ver para más detalles msdn.microsoft.com/en-us/library/t3c3bfhx.aspxclass C { int x; static void M() {
entonces M es perfectamente capaz de accederx
. Por ejemploint y = (new C()).x;
es legal.static void M() { this.x = 1; }
no es posible.this.x
está mal no porquex
no se pueda acceder sino porquethis
no existe. No es una cuestión de acceso en absoluto, es una cuestión de existencia .La inyección de dependencia sería una buena razón para realizar la llamada al método estático. Suponiendo que la implementación concreta de
SomeClass
tiene una cadena de herencia o es la implementación de otra clase. Puede usar una imitación de un objeto, pasarlo con fines de prueba para asegurarse de que su método haga lo que se supone que debe hacer, y luego informa sobre ese estado.fuente