una - public static java
Java: cuándo usar métodos estáticos (20)
Me pregunto cuándo usar métodos estáticos?
- Un uso común de
static
métodosstatic
es acceder a camposstatic
. Pero puedes tener métodos
static
, sin hacer referencia a variablesstatic
. Los métodos de ayuda sin referirse astatic
variablestatic
se pueden encontrar en algunas clases de java como java.lang.Mathpublic static int min(int a, int b) { return (a <= b) ? a : b; }
El otro caso de uso, puedo pensar que estos métodos combinados con
synchronized
métodosynchronized
es la implementación del bloqueo de nivel de clase en un entorno de múltiples subprocesos.
Diga si tengo una clase con algunos captadores y definidores, uno o dos métodos y quiero que esos métodos solo sean invocables en un objeto de instancia de la clase ¿Esto significa que debo usar un método estático?
Si necesita acceder al método en un objeto de instancia de la clase, su método debe ser no estático.
La page documentación de Oracle proporciona más detalles.
No todas las combinaciones de variables y métodos de instancia y clase están permitidas:
- Los métodos de instancia pueden acceder a las variables de instancia y los métodos de instancia directamente.
- Los métodos de instancia pueden acceder a las variables de clase y los métodos de clase directamente.
- Los métodos de clase pueden acceder a las variables de clase y los métodos de clase directamente.
- Los métodos de clase no pueden acceder directamente a las variables de instancia o los métodos de instancia; deben usar una referencia de objeto. Además, los métodos de clase no pueden usar esta palabra clave ya que no hay una instancia a la que se pueda referir.
Me pregunto cuándo usar métodos estáticos? Diga si tengo una clase con algunos captadores y definidores, uno o dos métodos y quiero que esos métodos solo sean invocables en un objeto de instancia de la clase ¿Esto significa que debo usar un método estático?
p.ej
Obj x = new Obj();
x.someMethod
o
Obj.someMethod
(¿Es esta la forma estática?)
Estoy bastante confundido!
Defina métodos estáticos solo en los siguientes escenarios:
- Si está escribiendo clases de utilidad y se supone que no se deben cambiar.
- Si el método no utiliza ninguna variable de instancia.
- Si alguna operación no depende de la creación de la instancia.
- Si hay algún código que todos los métodos de instancia puedan compartir fácilmente, extraiga ese código en un método estático.
- Si está seguro de que la definición del método nunca se cambiará o se anulará. Como métodos estáticos no se pueden anular.
Después de leer los artículos de Misko, creo que los métodos estáticos son malos desde el punto de vista de las pruebas. Debería tener factories lugar (tal vez utilizando una herramienta de inyección de dependencias como Guice ).
¿Cómo me aseguro de que solo tengo uno de algo?
solo tengo uno de algo El problema de "cómo me aseguro de que solo tengo uno de algo" está bien evitado. Solo crea una instancia de ApplicationFactory en su main, y como resultado, solo crea una instancia de todos sus singletons.
El problema básico con los métodos estáticos es que son códigos de procedimiento.
El problema básico con los métodos estáticos es que son códigos de procedimiento. No tengo idea de cómo probar el código de procedimiento de la unidad. La prueba unitaria supone que puedo instanciar una parte de mi aplicación de forma aislada. Durante la creación de instancias, conecto las dependencias con simulacros / amistosos que reemplazan las dependencias reales. Con la programación de procedimientos no hay nada que "cablear", ya que no hay objetos, el código y los datos están separados.
En realidad, usamos propiedades y métodos estáticos en una clase, cuando queremos usar una parte de nuestro programa que debería existir allí hasta que nuestro programa se ejecute. Y sabemos que, para manipular las propiedades estáticas, necesitamos métodos estáticos, ya que no forman parte de la variable de instancia. Y sin métodos estáticos, manipular propiedades estáticas consume mucho tiempo.
Estático: Obj.someMethod
Use static
cuando desee proporcionar acceso de nivel de clase a un método, es decir, donde el método debe ser invocable sin una instancia de la clase.
Hay algunas razones válidas para usar métodos estáticos:
Rendimiento : si desea que se ejecute algún código y no desea crear una instancia de un objeto adicional para hacerlo, póngalo 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 que podría ser completamente falso). Sí, es micro-optimización, y probablemente innecesaria. Y los programadores nunca hacemos cosas innecesarias solo porque son geniales, ¿no?
Práctica : en lugar de llamar al
new Util().method(arg)
Util.method(arg)
new Util().method(arg)
, llame aUtil.method(arg)
o almethod(arg)
con importaciones estáticas. Más fácil, más corto.Métodos de adición : realmente quería que la clase String tuviera un método de instancia
removeSpecialChars()
, pero no está ahí (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 sano), entonces creas una clase de utilidad y llamas aremoveSpecialChars(s)
lugar des.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. Entrada de datos, salida de datos. 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 le ayudará un poco más con métodos estáticos (al no permitir referencias a atributos de instancia, anular métodos, etc.).
También tendrás que crear un método estático si quieres hacer un singleton, pero ... no lo hagas. Quiero decir, pensar dos veces.
Ahora, lo que es más importante, ¿por qué no querría 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 (pre-Java 8) . Se necesita mucha flexibilidad de su diseño. Además, si necesita un estado , terminará con muchos errores de concurrencia y / o cuellos de botella si no tiene cuidado.
Los métodos estáticos deben invocarse en la clase, los métodos de instancia deben invocarse 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 existe realmente (se ha construido) y, por lo tanto, este sería un método de instancia.
Una clase de autos también podría tener un método de conteo llamado GetCarCount (). Esto devolvería el número total de autos creados (o construidos). Si no se han construido autos, este método devolvería 0, pero aún debería poder llamarse, y por lo tanto tendría que ser un método estático.
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, reciben información de los parámetros, realizan acciones en ella 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.
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 de 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 utiliza algún campo no estático de una clase, debe usar un método no estático.
Los métodos estáticos no necesitan ser invocados en el objeto y eso es cuando lo usas. Ejemplo: su Main () es una estática y no crea un objeto para llamarlo.
Los métodos estáticos son los métodos en Java que se pueden llamar sin crear un objeto de clase. Es de pertenecer a la clase.
Usamos el método estático cuando no necesitamos invocar el método utilizando la instancia.
Los métodos y variables estáticos son versiones controladas de funciones y variables ''globales'' en Java. Se puede acceder a los métodos como classname.methodName()
o classInstanceName.methodName()
, es decir, se puede acceder a los métodos y variables estáticos usando el nombre de la clase y también 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 a ella desde cualquier lugar), las clases internas se pueden declarar estáticas.
No, los métodos estáticos no están asociados con una instancia; pertenecen a la clase. Los métodos estáticos son tu segundo ejemplo; Los métodos de instancia son los primeros.
Se pueden usar métodos estáticos si
Uno no quiere realizar una acción en una instancia (métodos de utilidad)
Como se mencionó en algunas de las respuestas anteriores en este post, convertir millas en kilómetros o calcular la temperatura de Fahrenheit a Celsius y viceversa. Con estos ejemplos que utilizan el método estático, no es necesario crear una instancia de un objeto completamente nuevo en la memoria del montón. Considera a continuación
1. new ABCClass(double farenheit).convertFarenheitToCelcium() 2. ABCClass.convertFarenheitToCelcium(double farenheit)
el primero crea una nueva huella de clase para cada método invocado, Rendimiento, Práctico . Algunos ejemplos son las clases de StringUtils de la biblioteca de matemáticas y Apache-Commons a continuación
Math.random() Math.sqrt(double) Math.min(int, int) StringUtils.isEmpty(String) StringUtils.isBlank(String)
Uno quiere usarlo como una función simple. Las entradas se pasan explícitamente y se obtienen los datos de resultados como valor de retorno. Herencia, la instanciación de objetos no entra en la imagen. Conciso, legible .
NOTA : pocas personas discuten contra 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 simular métodos estáticos. Testabilidad . Ejemplo a continuación:
new MockUp<ClassName>() {
@Mock
public int doSomething(Input input1, Input input2){
return returnValue;
}
};
Si aplica una palabra clave estática con cualquier método, se conoce como método estático.
- Un método estático pertenece a la clase en lugar del objeto de una clase.
- Un método estático invocado sin la necesidad de crear una instancia de una clase.
- El método estático puede acceder al miembro de datos estáticos y puede cambiar su valor.
// 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 BBDIT indio 222 BBDIT estadounidense 333 BBDIT de China
Un método static
es un tipo de método que no necesita que se inicialice ningún objeto para que se llame. ¿Has notado que static
se usa en la función main
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.");
}
}
Un método estático tiene dos propósitos principales:
- Para los métodos de utilidad o de ayuda que no requieren ningún estado de objeto. Como no hay necesidad de acceder a las variables de instancia, tener métodos estáticos elimina la necesidad de que la persona que llama cree una instancia del objeto solo para llamar al método.
- Para el estado que es compartido por todas las instancias de la clase, como un contador. Todas las instancias deben compartir el mismo estado. Los métodos que simplemente usan ese estado también deben ser estáticos.
Una regla de oro: pregúntese "¿tiene sentido llamar a este método, incluso si aún no se ha construido un Obj?" Si es así, definitivamente debería ser estático.
Entonces, en un Car
clase Car
es posible que tenga un método double convertMpgToKpl(double mpg)
que sería estático, porque uno querría saber a qué se convierte 35mpg, incluso si nadie ha construido un automóvil. Pero el 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 un automóvil.
(Por cierto, lo contrario no siempre es cierto: a veces es posible que tenga un método que involucre dos objetos de Car
, y aún quiera que sea estático. Por ejemplo, Car theMoreEfficientOf( Car c1, Car c2 )
. Aunque esto podría convertirse en un no En la versión estática, algunos argumentarían que, dado que no hay una opción "privilegiada" de qué Coche es más importante, no debe obligar a la persona que llama a elegir un Coche como el objeto en el que invocará el método. Esta situación es importante para una fracción bastante pequeña de todos los métodos estáticos, sin embargo.)
Utilice un método estático cuando desee poder acceder al método sin una instancia de la clase.