2012-08-29 18 views
5

Sección 10.2 de convenciones de Java recomienda el uso de nombres de clase en lugar de los objetos a utilizar variables o métodos estáticos, es decir MyClass.variable1 o MyClass.methodName1() en lugar deconvención de Java en referencia a los métodos y variables

MyClass Obj1 = new MyClass();  
Obj1.variable1; 
Obj1.methodName1(); 

No hay una explicación de los fundamentos detrás de esto, aunque sospecho que esto tiene algo que ver con el uso de la memoria. Sería genial si alguien pudiera explicar esto.

+2

Si el método es estático, llámalo de la clase en sí; es menos confuso. p.ej. 'BigInteger.ONE.valueOf (" 10 ")' es confuso para lo que realmente se está haciendo. – nhahtdh

Respuesta

8

Supongo que quiere decir "para métodos estáticos y variables".

No hay diferencia con respecto a la memoria, excepto, por supuesto, si crea la instancia solo para llamar al método. Las convenciones no son para la eficiencia de la memoria, sino para la eficiencia del codificador, que está directamente relacionada con la legibilidad del código.

La razón es que mediante la lectura de

MyClass.methodName1() 

sabes que es un método estático y que no puede usar o modificar su instancia Obj1.

Y si se escribe

obj1.variable1; // note the "o" instead of "O", please do follow conventions 

entonces el lector tiene que leer su código fuente para saber si variable1 es estática o no.

+1

Publicación interesante sobre por qué puede ser confuso: http://stackoverflow.com/a/1439847/829571 – assylias

+0

@assylias Ejemplo interesante, sí. –

+0

@dystroy: gracias, entonces la idea principal es saber de inmediato, si la variable o el método es estático. – Alex

3

Si utiliza el objeto para el acceso de variable estática, entonces el compilador lo reemplazará con Class Name solamente.

Así

MyClass Obj1 = new MyClass();  
Obj1.variable1; 
Obj1.methodName1(); 

Se es igual que

MyClass.variable1; 
MyClass.methodName1(); 

Now Why to differentiate? Answer is - It is for better reading If someone see method being called on Class then he immediately come to know that it is static method. Also it prevents generation of one additional object to access the method.

+0

Pero la primera versión generalmente llamará a MyClass '. No sé si el compilador realmente optimiza esto, si init es trivial. –

+0

@HeikoSchmitz ["Cuando el compilador compila esa clase, decide en tiempo de compilación qué método exacto se utiliza para cada llamada de método estático (esa es la gran diferencia para las llamadas a métodos no estáticos: el método exacto para llamar solo se decide en tiempo de ejecución en esos casos "] (https://forums.oracle.com/forums/thread.jspa?threadID=1253445) –

+0

Eso está claro. Sin embargo, mi punto es que la primera versión incluye la construcción de una instancia de MyClass (incluyendo ctor, inicializador, etc.), que puede tener efectos secundarios y, por lo tanto, no es lo mismo que la segunda versión, donde no se genera ningún objeto. –

-1

variable estática pertenece a la clase y no a objeto (ejemplo). A una variable estática se puede acceder directamente por el nombre de clase y no necesita ningún objeto. ahorra espacio sin tener que tener variables para los mismos datos para cada clase.

Syntax : <class-name>.<variable-name> 

public class AA{ 

static int a =10; 


} 

Puede llamar

System.out.println(AA.a); 
System.out.println(aObject.a); 

No hay diferen entre dos llamadas, pero mantener la convención de codificación para mantener más readbale

0

Esto tiene que ver con publicstatic métodos y variables. Dado que estos métodos/variables están asociadas con la clase respectiva en lugar de una instancia de la clase, es agradable de usar referirse a estos métodos o variables como className.methodName() o className.variableName

"Understanding Instance and Class Members" sería un buen punto de partida para conocer el uso de la palabra clave estática para crear campos y métodos que pertenecen a la clase, en lugar de a una instancia de la clase

0

Es solo porque, el método público estático o la variable pública estática no está asociada a ningún objeto, sino a la clase.Aunque el diseñador del lenguaje ha dado la flexibilidad de invocarlos en los objetos, el lector del código se confundiría si esos son variables/métodos estáticos o métodos/variables de instancia. Entonces la legibilidad es la razón detrás de pedirle a los desarrolladores que los invoquen en las clases.

0

Tiene permiso para acceder a los miembros estáticos ya sea utilizando la notación de nombre de clase o accediendo a un objeto. No se recomienda utilizar la notación del objeto, ya que puede ser muy confuso.

public class TheClass { 
    public static final staticValue = 10; 
    public static void staticMethod() { 
     System.out.println("Hello from static method"); 
    } 

    public static void main(String ... args) { 
     TheClass obj = null; 

     // This is valid 
     System.out.println(obj.staticValue); 
     // And this too 
     System.out.println(obj.staticMethod()); 

     // And this is also valid 
     System.out.println(((TheClass)null).staticValue); 
     // And this too 
     System.out.println(((TheClass)null).staticMethod()); 

    } 
} 

Es mucho más claro si los métodos estáticos y las variables se llaman con la notación de nombre de clase.

Cuestiones relacionadas