Una regla general: pregúntese "¿Tiene sentido llamar a este método, incluso si todavía no se ha construido ningún objeto?" Si es así, definitivamente debería ser estático.
Entonces, en una clase Car
, podrías tener un método:
double convertMpgToKpl(double mpg)
... lo cual sería estático, porque uno podría querer saber a qué se convierte 35mpg, incluso si nadie ha construido alguna vez un Car
. Pero este método (que establece la eficiencia de un particular Car
):
void setMileage(double mpg)
... no puede ser estático ya que es inconcebible llamar al método antes de que Car
se haya construido ninguno .
(Por cierto, lo contrario no siempre es cierto: a veces puede tener un método que involucra dos Car
objetos, y aún así quiere que sea estático. Por ejemplo:
Car theMoreEfficientOf( Car c1, Car c2 )
Aunque esto podría convertirse a una versión no estática, algunos argumentarían que, dado que no existe una opción "privilegiada", lo cual Car
es más importante, no debe obligar a la persona que llama a elegir una Car
como el objeto que invocará. método en. Sin embargo, esta situación representa una fracción bastante pequeña de todos los métodos estáticos).
Car#isMoreEfficientThan(Car)
. Tiene la ventaja de que el auto que devuelve en un empate no es arbitrario. Es obvio por el título del método lo que se devuelve en un empate.Defina métodos estáticos solo en los siguientes escenarios:
fuente
Hay algunas razones válidas para usar métodos estáticos:
Rendimiento : si desea ejecutar algún código y no desea crear una instancia de un objeto adicional para hacerlo, introdúzcalo en un método estático. La JVM también puede optimizar mucho los métodos estáticos (creo que una vez leí a James Gosling declarando que no necesita instrucciones personalizadas en la JVM, ya que los métodos estáticos serán igual de rápidos, pero no pudieron encontrar la fuente, por lo tanto podría ser completamente falso). Sí, es micro-optimización, y probablemente innecesaria. Y nosotros los programadores nunca hacemos cosas innecesarias solo porque son geniales, ¿verdad?
Practicidad : en lugar de llamar
new Util().method(arg)
, llamarUtil.method(arg)
omethod(arg)
con importaciones estáticas. Más fácil, más corto.Agregar métodos : realmente quería que la clase String tuviera un
removeSpecialChars()
método de instancia, pero no está allí (y no debería, ya que los caracteres especiales de su proyecto pueden ser diferentes de los del otro proyecto), y no puede agregarlo (ya que Java es algo sensato), por lo que crea una clase de utilidad y llama enremoveSpecialChars(s)
lugar des.removeSpecialChars()
. Dulce.Pureza : tomando algunas precauciones, su método estático será una función pura , es decir, lo único de lo que depende es de sus parámetros. Datos de entrada, datos de salida. Esto es más fácil de leer y depurar, ya que no tiene que preocuparse por las peculiaridades de la herencia. También puede hacerlo con métodos de instancia, pero el compilador lo ayudará un poco más con los métodos estáticos (al no permitir referencias a atributos de instancia, métodos de anulación, etc.).
También tendrá que crear un método estático si desea hacer un singleton, pero ... no lo haga. Quiero decir, piénsalo dos veces.
Ahora, más importante, ¿por qué no querrías crear un método estático? Básicamente, el polimorfismo sale por la ventana . No podrá anular el método
ni declararlo en una interfaz(anterior a Java 8) . Se necesita mucha flexibilidad de su diseño. Además, si necesita estado , terminará con muchos errores de concurrencia y / o cuellos de botella si no tiene cuidado.fuente
Después de leer los artículos de Misko, creo que los métodos estáticos son malos desde el punto de vista de la prueba. Debería tener fábricas en su lugar (tal vez utilizando una herramienta de inyección de dependencia como Guice ).
¿Cómo me aseguro de tener solo uno de algo?
El problema básico con los métodos estáticos es que son código de procedimiento
fuente
Math.abs()
oArrays.sort()
, incluso métodos en los que puede pasar todas las dependencias , no veo cómo eso impediría alguna vez las pruebas unitarias. Diría que una regla general simple es: si alguna vez tiene alguna razón para burlarse de la lógica de procedimiento, entonces no la ponga en un método estático. Nunca he tenido una razón para burlarmeArrays.sort()
oMath.abs()
.Un
static
método es un tipo de método que no necesita ningún objeto para inicializarse para que se llame. ¿Has notado questatic
se usa en lamain
función en Java? La ejecución del programa comienza desde allí sin que se cree un objeto.Considere el siguiente ejemplo:
fuente
Los métodos estáticos en Java pertenecen a la clase (no una instancia de ella). No utilizan variables de instancia y, por lo general, toman datos de los parámetros, realizan acciones en ellos y luego devuelven algún resultado. Los métodos de instancias están asociados con objetos y, como su nombre lo indica, pueden usar variables de instancia.
fuente
No, los métodos estáticos no están asociados con una instancia; Pertenecen a la clase. Los métodos estáticos son su segundo ejemplo; Los métodos de instancia son los primeros.
fuente
Si aplica una palabra clave estática con cualquier método, se conoce como método estático.
// Programa para cambiar la propiedad común de todos los objetos (campo estático).
O / P: 111 BBDIT indio 222 BBDIT estadounidense 333 BBDIT de China
fuente
Los métodos estáticos no están asociados con una instancia, por lo que no pueden acceder a ningún campo no estático en la clase.
Usaría un método estático si el método no usa ningún campo (o solo campos estáticos) de una clase.
Si se usan campos no estáticos de una clase, debe usar un método no estático.
fuente
Los métodos estáticos deben llamarse en la Clase, los métodos de Instancia deben llamarse en las Instancias de la Clase. Pero, ¿qué significa eso en realidad? Aquí hay un ejemplo útil:
Una clase de automóvil podría tener un método de instancia llamado Accelerate (). Solo puede acelerar un automóvil, si el automóvil realmente existe (ha sido construido) y, por lo tanto, este sería un método de instancia.
Una clase de automóvil también podría tener un método de conteo llamado GetCarCount (). Esto devolvería el número total de automóviles creados (o construidos). Si no se han construido automóviles, este método devolvería 0, pero aún debería poder llamarse y, por lo tanto, debería ser un método estático.
fuente
En realidad, usamos propiedades y métodos estáticos en una clase, cuando queremos usar alguna parte de nuestro programa debería existir allí hasta que nuestro programa se esté ejecutando. Y sabemos que, para manipular propiedades estáticas, necesitamos métodos estáticos, ya que no son parte de la variable de instancia. Y sin métodos estáticos, manipular propiedades estáticas lleva mucho tiempo.
fuente
Use un método estático cuando desee poder acceder al método sin una instancia de la clase.
fuente
Estático:
Obj.someMethod
Úselo
static
cuando desee proporcionar acceso a nivel de clase a un método, es decir, donde el método debe ser invocable sin una instancia de la clase.fuente
Los métodos estáticos no necesitan ser invocados en el objeto y eso es cuando lo usa. Ejemplo: su Main () es estático y no crea un objeto para llamarlo.
fuente
Los métodos y variables estáticas son versiones controladas de funciones y variables 'globales' en Java. En qué métodos se puede acceder como
classname.methodName()
oclassInstanceName.methodName()
, es decir, se puede acceder a métodos estáticos y variables utilizando el nombre de la clase, así como instancias de la clase.La clase no se puede declarar como estática (porque no tiene sentido. Si una clase se declara pública, se puede acceder desde cualquier lugar), las clases internas se pueden declarar estáticas.
fuente
Se pueden usar métodos estáticos si
Uno no quiere realizar una acción en una instancia (métodos de utilidad)
Uno quiere usarlo como una función simple. Las entradas se pasan explícitamente y se obtienen los datos del resultado como valor de retorno. Herencia, la instanciación de objetos no entra en escena. Conciso, legible .
NOTA : Pocas personas argumentan en contra de la capacidad de prueba de los métodos estáticos, ¡pero los métodos estáticos también se pueden probar! Con jMockit, uno puede burlarse de los métodos estáticos. La capacidad de prueba . Ejemplo a continuación:
fuente
Los métodos estáticos son los métodos en Java que se pueden invocar sin crear un objeto de clase. Es pertenecer a la clase.
Usamos el método estático cuando no necesitamos que se invoque el método usando la instancia.
fuente
static
métodos es acceder a losstatic
campos.Pero puede tener
static
métodos, sin hacer referencia astatic
variables. Los métodos auxiliares sinstatic
variable de referencia se pueden encontrar en algunas clases de java como java.lang.MathEl otro caso de uso, puedo pensar en estos métodos combinados con el
synchronized
método es la implementación del bloqueo de nivel de clase en un entorno de subprocesos múltiples.Si necesita acceder al método en un objeto de instancia de la clase, su método debe ser no estático.
La página de documentación de Oracle proporciona más detalles.
No se permiten todas las combinaciones de variables y métodos de instancia y clase:
fuente
A common use for static methods is to access static fields.
no es un argumento.Un método estático tiene dos propósitos principales:
fuente
En eclipse puede habilitar una advertencia que lo ayuda a detectar posibles métodos estáticos. (Sobre la línea resaltada hay otra que olvidé resaltar)
fuente
Siempre que no desee crear un objeto para llamar a un método en su código, simplemente declare ese método como estático. Dado que el método estático no necesita una instancia para ser llamado, pero la captura aquí no es que todos los métodos estáticos sean llamados automáticamente por JVM. Este privilegio es disfrutado solo por el método main () "public static void main [String ... args]" en java porque en Runtime este es el método Signature public "static" void main [] buscado por JVM como punto de entrada a iniciar la ejecución del código.
Ejemplo:
Salida: - JVM ejecuta este método estático. Este método estático debe llamarse explícitamente. Este método estático debe llamarse explícitamente. Este método estático debe llamarse explícitamente.
fuente