Java Static vs Instance

Entonces mi amigo codificador odia usar la encoding static . Sin embargo, mi progtwig Java está lleno de enlaces entre clases, ¡y tengo muchos de ellos!

¿Vale la pena volver a escribir todo el código para eliminar el método estático?

¿Hay alguna ventaja de usar uno sobre el otro?

1. Una variable de instancia es una por Objeto , cada objeto tiene su propia copia de la variable de instancia.

P.ej:

 public class Test{ int x = 5; } Test t1 = new Test(); Test t2 = new Test(); 

Tanto t1 como t2 tendrán su propia copia de x .

2. Una variable estática es una por clase , cada objeto de esa clase comparte la misma variable estática.

P.ej:

 public class Test{ public static int x = 5; } Test t1 = new Test(); Test t2 = new Test(); 

Tanto t1 como t2 tendrán exactamente una x para compartir entre ellos.

3. Una variable estática se inicializa cuando la JVM carga la clase.

4. Un static method no puede acceder a Non-static variable o método Non-static .

5. Static methods junto con las Static variables pueden imitar un Singleton Pattern , pero NO ES LA FORMA CORRECTA , como cuando hay muchas clases, entonces no podemos estar seguros sobre el orden de carga de la clase de JVM, y esto puede crear una problema.

static es para los casos en los que no desea tener copia para cada instancia

instance variables de instance son para los casos en los que desea una copia separada para cada instancia de objeto.

En función de los casos comerciales, cuál usar puede cambiar.

Si tiene demasiadas funciones y variables estáticas, puede conducir a un enfoque más funcional en lugar de OO verdadero. Además, si tiene una variable estática pública, replicará la variable global que no es buena. Hacer un seguimiento de ellos es una pesadilla.

En general, mi regla es usar variables de instancia si puedes y solo tienes variables y funciones estáticas si realmente es genérico sobre una clase en lugar de un objeto

Esta es una respuesta bastante buena a una pregunta similar a Java: cuándo usar métodos estáticos

En lugar de solo vincular los métodos, considere usar la nueva operación para crear un nuevo objeto y acceda al método de una manera no estática.

antes de

 public void myMethod(){ Time.setTime(Time.getTime() + 20); System.out.println(Time.getTime()); } 

después

 public void myMethod(){ Time t = new Time(); t.setTime(t.getTime() + 20); System.out.println(t.getTime()); } 

Cualquier estado que se mantenga en estos métodos será ahora la instancia de tiempo que haya creado. También podría compartir la variable t entre otros métodos si fuera necesario.

Recolección de basura: los campos estáticos viven mucho más tiempo que los campos de instancia. Desde un punto de vista lógico, los campos estáticos solo se deben compartir entre cada instancia, si es realmente su caso, no hay problema, por supuesto.

¿Estás hablando de métodos estáticos o propiedades estáticas?

En lo que respecta a los métodos estáticos, solo hay una forma de abusar de ellos, y es entonces cuando defines métodos que toman una instancia de objeto como parámetro. Nunca deberías necesitar hacer eso y, en mi opinión, hacerlo es una mala práctica de encoding. Aquí hay un ejemplo:

 static int add(ThisClass a, ThisClass b) { return a.value + b.value; } 

Si está hablando de variables estáticas en la clase, básicamente está en el tema de “singletons”, que es donde se pretende que haya solo una instancia de una clase en particular. Los Singletons están sujetos a mucho abuso. Son utilizados por muchas bibliotecas de clases (piense en JDNI y las clases de registro) pero si una aplicación hace un uso extensivo de ellas, puede ser un signo de un progtwig mal estructurado. Eso es probablemente lo que tu amigo está quejándose.

Instancia y variable estática:

Responda a su pregunta: Yo diría que vale la pena usar una variable estática para guardar la asignación de memoria.

Asignación de memoria:

Para la variable estática, solo se asigna una ubicación de memoria independientemente del objeto creado y para la variable de instancia cada objeto asigna una ubicación de memoria

Ahora considere este ejemplo, considere que está trabajando en el proyecto interno de la empresa donde tiene que crear un objeto 1M para la clase Empleado y algunas propiedades para la clase Empleado son eid, ename, ecompany ahora Lo importante es que todos los empleados trabajan en la empresa XYZ. a la propiedad ecompany va a ser “XYZ” independientemente del Empleado.

Ahora que conoce la situación, el valor de la propiedad ecompany será XYZ para 1 millón de objetos.

Ahora usted decide que quiere declarar la propiedad ecomapny como estática o instancia considerando la asignación de memoria

si lo declaras como estático, la memoria mínima asignada a ecompany será de solo 48 bytes, lo que se compara muy poco con la memoria necesaria para almacenar 1 millón de variables de instancia. 100000 * 48 bytes = 48 millones de bytes.

Cuando usas objetos estáticos (excepto en el caso de singleton), en realidad estás implementando progtwigción funcional combinada con variables globales. Si hace eso mucho, debería reconsiderar su diseño o usar Java (quizás debería usar un lenguaje de progtwigción funcional como lista, esquema, etc.).

Pro estático

Una vez que se llama a un miembro estático desde el interior o el exterior de la clase, se llama al constructor estático de la clase. El “objeto estático” vivirá toda la sesión, por lo tanto, ganará en rendimiento.

Con estática

Los miembros estáticos no pueden tener estados, por lo tanto, no pueden hablar con miembros no estáticos de la clase.

Ejemplo

Si consideramos la clase BigInteger , esta clase ganaría si algunas de las partes se convirtieran en miembros estáticos.

Una instancia de la clase representa (como se esperaba) un entero grande.

Sin embargo, los métodos principales de agregar y multiplicar no son estáticos (que deberían estar en un mundo mejor), lo cual es malo para el rendimiento.

Por lo tanto, en la práctica uno no debe tener miedo de las mezclas entre estático y no estático.

No me gusta utilizar variables o métodos estáticos porque no tienen herencia real. Esto hace que sea más difícil burlarse de las pruebas. El uso de instancias te da la flexibilidad del polymorphism completo. Por otro lado, a veces son necesarias variables estáticas, por ejemplo, con un caché global. Los métodos estáticos pueden ser un beneficio si proporcionan métodos auxiliares para clases / objetos / primitivas a las que no puede acceder o ampliar. Estos métodos de ayuda son tan simples que no necesitan herencia. Por ejemplo java.util.Arrays class o java.util.Collections.