Pregunta Java: cuándo usar métodos estáticos


Me pregunto cuándo usar métodos estáticos? Digamos si tengo una clase con algunos getters y setters, uno o dos métodos, y quiero que esos métodos solo sean invocables en un objeto instancia de la clase. ¿Esto significa que debería usar un método estático?

p.ej

Obj x = new Obj();
x.someMethod

o

Obj.someMethod

(¿Es esta la manera estática?)

¡Estoy bastante confundido!


715
2018-04-19 23:05


origen


Respuestas:


Una regla empírica: pregúntate "¿tiene sentido llamar a este método, incluso si todavía no se ha construido Obj?" Si es así, definitivamente debe ser estático.

Entonces en una clase Car puedes tener un método double convertMpgToKpl(double mpg) que sería estático, porque uno podría querer saber a qué se convierte 35mpg, incluso si nadie ha construido un automóvil. Pero void setMileage(double mpg) (que establece la eficiencia de un automóvil en particular) no puede ser estático, ya que es inconcebible llamar al método antes de que se haya construido cualquier automóvil.

(Por cierto, lo contrario no siempre es cierto: a veces puede tener un método que implica dos Car objetos, y todavía quiere que sea estático. P.ej. Car theMoreEfficientOf( Car c1, Car c2 ). Aunque esto podría convertirse en una versión no estática, algunos argumentarían que dado que no hay una opción "privilegiada" de la cual el automóvil sea más importante, no debes forzar a la persona que llama a elegir un auto como el objeto que vas a usar. invocar el método en. Sin embargo, esta situación representa una fracción bastante pequeña de todos los métodos estáticos).


1176
2018-04-19 23:42



Defina métodos estáticos solo en los siguientes escenarios:

  1. Si está escribiendo clases de utilidad y se supone que no deben cambiarse.
  2. Si el método no está usando ninguna variable de instancia.
  3. Si alguna operación no depende de la creación de la instancia.
  4. Si hay algún código que pueda ser compartido fácilmente por todos los métodos de instancia, extraiga ese código en un método estático.
  5. Si está seguro de que la definición del método nunca será modificada o anulada. Como los métodos estáticos no pueden ser anulados.

458
2018-03-15 14:40



Hay algunas razones válidas para usar métodos estáticos:

  • Actuación: si desea que se ejecute 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 y afirmé que no necesitas instrucciones personalizadas en la JVM, ya que los métodos estáticos serán igual de rápidos, pero no podrían encontrar la fuente; podría ser completamente falso). Sí, es una micro-optimización, y probablemente innecesaria. Y los programadores nunca hacemos cosas innecesarias solo porque son geniales, ¿verdad?

  • Sentido práctico: en lugar de llamar new Util().method(arg), llamada Util.method(arg), o method(arg) con importaciones estáticas. Más fácil, más corto.

  • Agregar métodos: realmente quería que la clase String tuviera una 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 está un tanto cuerda), por lo que crea una clase de utilidad, y llama removeSpecialChars(s) en lugar de s.removeSpecialChars(). Dulce.

  • Pureza: tomando algunas precauciones, su método estático será una función pura, es decir, de lo único que depende es de sus parámetros. Datos entrantes, datos salientes. Esto es más fácil de leer y depurar, ya que no tienes que preocuparte por los caprichos de la herencia. También puedes hacerlo con métodos de instancia, pero el compilador te ayudará un poco más con métodos estáticos (al no permitir referencias a atributos de instancia, métodos de anulación, etc.).

También deberá crear un método estático si desea hacer un singleton, pero ... no. Quiero decir, piensa dos veces.

Ahora, más importante, por qué no querrías para crear un método estático? Básicamente, polimorfismo sale por la ventana. No podrás anular el método, ni declararlo en una interfaz  (pre-Java 8). Se necesita mucha flexibilidad de su diseño. Además, si necesita estado, terminarás con muchos errores de concurrencia y / o cuellos de botella si no tiene cuidado.


138
2017-12-11 15:03



Después de leer los artículos de Misko, creo que métodos estáticos son malos desde un punto de vista de prueba. Deberías suerte en su lugar (tal vez usando una herramienta de inyección de dependencia como Guice)

¿Cómo me aseguro de que solo tengo uno de algo?

solo tiene uno de algo   El problema de "cómo me aseguro de que   solo tiene uno de algo "está muy bien   eludido. Crea una instancia solo   solo ApplicationFactory en su   principal, y como resultado, usted solo   instanciar una sola instancia de todo   de tus singletons

El problema básico con los métodos estáticos es que son código de procedimiento

El problema básico con los métodos estáticos es   son código de procedimiento. No tengo   idea de cómo probar la unidad de código de procedimiento.   Las pruebas unitarias asumen que puedo   crear una instancia de mi aplicación   aisladamente. Durante la instanciación   Conecté las dependencias con   burlas / amistosos que reemplazan el   dependencias reales. Con procedimiento   programar no hay nada que "cablear"   ya que no hay objetos, el código   y los datos están separados.


37
2018-04-20 01:14



UN static método es un tipo de método que no necesita ningún objeto para ser inicializado para que sea llamado. Has notado static se usa en el main función en Java? La ejecución del programa comienza desde allí sin que se cree un objeto.

Considere el siguiente ejemplo:

 class Languages 
 {
     public static void main(String[] args) 
     {
         display();
     }

     static void display() 
     {
         System.out.println("Java is my favorite programming language.");
     }
  }

26
2018-06-10 09:59



Los métodos estáticos en Java pertenecen a la clase (no a una instancia de este). No usan variables de instancia y generalmente tomarán la entrada de los parámetros, realizarán acciones en ella y luego devolverán algún resultado. Los métodos de instancia están asociados con objetos y, como su nombre lo indica, pueden usar variables de instancia.


15
2018-04-19 23:08



No, los métodos estáticos no están asociados con una instancia; ellos pertenecen a la clase. Los métodos estáticos son su segundo ejemplo; los métodos de instancia son los primeros.


10
2018-04-19 23:08



Si aplica la palabra clave estática con cualquier método, se lo conoce como método estático.

  1. Un método estático pertenece a la clase en lugar de ser objeto de una clase.
  2. Un método estático invocado sin la necesidad de crear una instancia de una clase.
  3. el método estático puede acceder al miembro de datos estáticos y puede cambiar el valor de este.

// Programa de cambio de la propiedad común de todos los objetos (campo estático).

class Student9{  
 int rollno;  
 String name;  
 static String college = "ITS";  

 static void change(){  
 college = "BBDIT";  
 }  

 Student9(int r, String n){  
 rollno = r;  
 name = n;  
 }  

 void display (){System.out.println(rollno+" "+name+" "+college);}  

public static void main(String args[]){  
Student9.change();  

Student9 s1 = new Student9 (111,"Indian");  
Student9 s2 = new Student9 (222,"American");  
Student9 s3 = new Student9 (333,"China");  

s1.display();  
s2.display();  
s3.display();  
}  }

O / P: 111 indio BBDIT        222 BBDIT estadounidense        333 China BBDIT


9
2018-06-13 16:10



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.

Utilizaría un método estático si el método no utiliza ningún campo (o solo campos estáticos) de una clase.

Si se utilizan campos no estáticos de una clase, debe utilizar un método no estático.


6
2018-04-19 23:12



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 las propiedades estáticas consume mucho tiempo.


6
2018-03-11 04:56



Los métodos y variables estáticos son versiones controladas de las funciones y variables "globales" en Java. En qué métodos se puede acceder como classname.methodName() o classInstanceName.methodName(), es decir, se puede acceder a los métodos y variables estáticos utilizando el nombre de clase, así como las 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.


4
2017-09-30 20:28