2011-06-03 14 views
44

En general, ¿hay algún beneficio al declarar una clase privada como estática?¿Cuándo quisiera que mi clase privada sea estática?

¿En qué casos quisiera usar uno de los siguientes sobre el otro?

private static class Foo 
{ 
    ... 
} 

vs

private class Foo 
{ 
    ... 
} 
+1

El [-clase java-interior-y-anidada de clase estática] (http : //stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class) puede ser útil. – MockerTim

+0

Puede encontrar la segunda respuesta en este artículo útil: http://stackoverflow.com/questions/1844355/java-static-class – gwood

Respuesta

2

Si necesita acceso a las variables miembro/métodos de la clase envolvente, utilice la forma no estática. Si no lo hace, use la forma estática.

+1

Esta es una respuesta pobre. Incluso desde una clase estática, si obtengo referencia al objeto de la clase padre, puedo acceder a los miembros privados. –

+0

Pero ¿por qué lo harías? Si necesita acceder a las variables privadas y es una clase interna, simplemente conviértala en no estática en lugar de hacerla estática y pasar una referencia al elemento primario. –

+0

Son conceptos diferentes. no estático (es decirinner) las clases tienen referencia implícita al objeto de la clase padre. Por lo tanto, no puede tener el objeto de la clase interna si no hay ningún objeto de la clase principal. Un ejemplo de esto sería Map.Entry (o mejor Iterator) - necesita referencia al objeto de mapa principal. un ejemplo de clase anidada estática sería Builder, necesita acceso al constructor privado del padre –

-1

Las clases estáticas difieren de las clases normales solo en que se puede acceder sin que se creen sus instancias. así que si necesita que alguna clase sea accesible cada vez, use static

+2

No creo que haya preguntado qué es la clase estática. – BBdev

1

Supongo que se refiere a clases internas.

Creo que la motivación vendría de la forma en que desea asociar su clase interna. Si quiere que su clase interna esté asociada a una instancia específica de su clase externa, debería usar private class; de lo contrario, use private static class.

+0

Estoy bastante seguro de que las clases 'privadas 'e' internas 'son sinónimos. –

27

Creo que este es un buen punto de partida: http://java67.blogspot.fi/2012/10/nested-class-java-static-vs-non-static-inner.html

1) Anidado clase estática no necesita referencia de clase externa, pero no clase anidada estática o clase interna requiere referencia de clase exterior. Usted no puede crear una instancia de clase interna sin crear una instancia de Clase externa. Esto es, con mucho, lo más importante a considerar mientras hace que una clase anidada sea estática o no estática.

2) la clase estática es en realidad miembro estático de la clase y se puede usar en contexto estático, p. método estático o bloque estático de la clase externa.

3) Otra diferencia entre la clase anidada estática y no estática es que no puede acceder a miembros no estáticos, p. método y campo en clase estática anidada directamente. Si lo hace, obtendrá un error como "no miembro estático no se puede utilizar en contexto estático". Mientras que la clase interna puede acceder a los miembros estáticos y no estáticos de la clase externa.

+2

esta debería ser la respuesta aceptada. – Dave

+0

Pero, hemos usado 'private', ¿seguirá estando accesible? –

+1

, será accesible solo dentro de la clase de anidación y no en el mundo exterior, ya que es privado a la clase de anidación –

0

Me pareció útil tener una excepción específica en una clase abstracta genérica. Es decir:

public abstract class AbstractClass <T> 
{ 
    private void doSomethingOrThrowException() throws SpecificException 
    { 
     .... 

     if (! successful) 
     { 
      throw new SpecificException(); 
     } 
    } 

    private static class SpecificException extends Exception {} 
} 

Si tuviera que dejar de lado la estática, el compilador me da un error que indica: The generic class AbstractClass<T>.SpecificException may not subclass java.lang.Throwable

Cuestiones relacionadas