2012-08-10 20 views
20

Así que mi amigo programador odia el uso de la codificación static. Sin embargo, mi programa Java está lleno de enlaces entre clases, ¡y tengo muchos de ellos!Java Static vs Instance

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

¿Hay alguna ventaja de usar una sobre la otra?

+2

Me parece que el uso de variables estáticas para mantener el estado hace que sus programas no se puedan mantener, es básicamente como usar variables globales. La estática privada dentro de una clase no tiene el mismo problema ya que no hay código que acceda a ella desde cualquier lugar, es decir, código de espagueti. –

Respuesta

33

1. una variable de instancia es uno por objeto, cada objeto tiene su propia copia de variable de instancia.

Ej:

public class Test{ 

    int x = 5; 

} 

Test t1 = new Test(); 
Test t2 = new Test(); 

Tanto t1 y t2 se tener su propia copia dex.

2. Una variable estática es uno por clase, todos los objetos de esa clase comparte la misma variable estática.

Ej:

public class Test{ 

    public static int x = 5; 

} 

Test t1 = new Test(); 
Test t2 = new Test(); 

Tanto t1 y t2 tendrá la exactamente una x para compartir entre ellos.

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

4. Un static methodno puede acceso Non-static variable o método.

5.Static methods junto con Static variables puede imitan un Singleton Pattern, pero no es la manera correcta, como cuando hay un montón de clases, entonces no podemos estar seguros acerca de la orden de carga de clases JVM, y esto puede crear un problema.

+4

No creo que la pregunta sea qué son las variables estáticas y por qué son malas. Es si vale la pena eliminar las variables estáticas que su amigo codificador dice que son malas. –

+4

He descrito cuáles son y cómo están asociados con la Clase. Ahora depende del amigo codificador decidir si usar o no ... También mencioné en mi 5 ° punto que la forma en que a veces empeora –

7

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

instance variables son para los casos en los que desee copia separada para cada instancia del objeto.

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

+0

El problema es que los campos estáticos suelen ser una instancia de código malicioso. Especialmente como lo mencionó el OP, dado que se utilizan para la comunicación entre clases, básicamente son variables globales. Me mantengo alejado de cualquier variable pública estática que no sea de solo lectura. –

+0

@JuanMendes: de acuerdo con su comentario. – kosa

+0

¿Es esto lo mismo que utilizarlo para funciones y variables? – Kezz101

3

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, solo se supone que los campos estáticos se compartan entre todas las instancias; si es realmente así, no hay problema, por supuesto.

+1

. Creo que su punto es que las variables estáticas públicas son las malas (excepto las constantes) –

+0

@JuanMendes, ¡es verdad! debería haber mencionado eso. Gracias – Eugene

4

Si tiene demasiadas funciones estáticas y variables, 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.

Generalmente mi regla es el uso de variables de instancia si es posible y sólo tienen las variables y funciones estáticas si realmente es genérico sobre una clase en lugar de un objeto

Esto es absolutamente una buena respuesta a unas preguntas similares Java: when to use static methods

En lugar de simplemente vincular a 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

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 llevó a cabo en estos métodos ahora será la instancia de que el tiempo que ha creado. También podría compartir la variable t entre otros métodos si fuera necesario.

+0

Entonces, ¿qué es exactamente tan malo acerca de las variables estáticas públicas? – Kezz101

+0

El problema es que imitan variables globales. Estos pueden actualizarse en cualquier parte del código, lo que hace que sea muy difícil seguir dónde están actualizados y en qué estado se encuentran. Puede provocar errores que son muy difíciles de encontrar. Este enlace es bastante bueno para explicarlo. http://c2.com/cgi/wiki?GlobalVariablesAreBad Si quieres más claridad, házmelo saber – RNJ

+0

Ah, ahora lo entiendo. Gracias por la confirmación: D – Kezz101

0

Cuando utiliza objetos estáticos (excepto en el caso de singleton) en realidad está implementando programació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 programación funcional como lista, esquema, etc.).

1

¿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 define los 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 codificación. He aquí un ejemplo:

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

Si usted está hablando de variables estáticas en la clase, que son básicamente en el tema de "hijos únicos", que es donde no está destinado a ser sólo una instancia de una clase 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 programa mal estructurado. Eso es probablemente lo que tu amigo está quejándose.

0

Pro estático

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

Con estáticas

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

Ejemplo

Si consideramos el BigInteger class, esta clase ganaría si algunas de las partes se convirtieron 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 que es malo para el rendimiento.

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

0

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 polimorfismo 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.

1

Instancia y variables estáticas:

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

asignación de memoria:

Para solamente una localización variable estática memoria se asigna irespective a ninguna de objeto creado y para Instancia variable de para cada posición de memoria de objetos asignados

Consideremos ahora este ejemplo , considere que está trabajando en el proyecto interno de la empresa donde tiene que crear el objeto 1M a Clase de empleado y alguna propiedad a la clase Empleado es e id, ename, ecompany ahora Lo importante es que todos los empleados están trabajando en XYZ empresa valor de la propiedad ecompany va a ser "XYZ" independientemente de Empleado.

Ahora usted sabe la situación, el valor de la propiedad eCompany va a ser XYZ de 1 millón de objetos.

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

si se declara como un recuerdo a continuación mínimo estática asignada a eCompany será de sólo 48 bytes, que muy menos comparar a la memoria necesaria para almacenar 1 millón de variables de instancia. 100000 * 48 bytes = 48 millones de bytes.

Cuestiones relacionadas