2011-01-27 22 views
14

Esto está en relación con mi respuesta a una pregunta proporcionada en este tema: Are Inner Classes lightweight?volver más de una instancia de una clase interna anónima

que recuerdo de mi lectura que si sólo se puede crear un objeto a partir de un único anónimo clase interna, y por esta razón, si quiere decir crear una clase ActionListener y desea crear varios objetos de esta clase (sin usar la reflexión), para no usar una clase interna anónima, sino una clase interna privada o un soporte a lo largo de la clase, pero la gente me dice que estoy equivocado. ¿Alguien puede aclarar esto por mí? Por favor revise el enlace ya que contiene más detalles, pero si algo no está claro, ¡por favor pregunte!

+0

Gracias, creo que entiendo, pero esto requeriría la creación de varias clases - si he entendido bien. La pregunta tiene un código para una sola clase interna anónima, ¿puede hacer varias instancias de sus objetos? Y no me refiero al uso de un bucle, ya que, de nuevo, eso crearía múltiples clases --- uy, ¿a dónde fue tu comentario? –

+1

Creo que te refieres a varias instancias de su clase? Un objeto es en sí mismo una instancia –

+1

@Hovercraft, no puede poner código legible en los comentarios. ;) –

Respuesta

16

Puede crear cualquier número de objetos de clases anónimas, puede crear en un solo lugar en el código (a menos que copie el código)

ExecutorService service = ... 
for(int i=0;i<1000*1000;i++) { 
    final int finalI = i; 
    service.submit(new Runnable() { 
     public void run() { 
     System.out.println("Task "+finalI+" run."); 
     } 
    }); 
} 

Este código va a crear 1 millón de objetos de la misma clase.

+0

"Este código creará 1 millón de objetos de la misma clase". Aquí es donde estoy confundido. ¿Esto no crearía un millón de clases, cada una con una instancia? Este es el quid de la cuestión. –

+0

Tengo que volver al trabajo :(, pero volveré a esta discusión en unos pocos horas. A todos, gracias por todas las entradas !!! –

+4

@Hovercraft Full Of Eels No solo hay una * clase * creada. Esta clase es la que tiene el gracioso nombre * horneado en el byte-code *. (Java simplemente hace un poco de crear una clase interna * nombrada * en tu nombre y asegurándote de que esté configurada en contexto cuando se creó). Simplemente no hay forma de acceder muy bien al tipo, excepto como una nueva * instancia * que es la " resultado "de la declaración de clase anónima. –

4

No está claro para mí. Tal vez si analizamos las especificaciones encontraremos evidencia de que las clases internas deberían tratarse de la misma manera que las clases normales. Sin embargo, en espíritu, una clase interna depende de la instancia externa, la clase no existe más allá de la instancia. Esto es diferente de las clases "normales" cuya existencia es básicamente perpetua. Dos clases internas de dos instancias externas, por supuesto, están relacionadas entre sí, siendo creadas por el mismo código fuente, pero eso no significa que deben ser idénticas o incluso iguales.

Existen evidencias de que los diseñadores de Java pensaban de esta manera, que una clase interna en espíritu vive dentro del alcance de la instancia externa. Por ejemplo, la curiosa sintaxis outerInstance.new InnerClass(). Por ejemplo, no hay variables estáticas, no hay inicializadores estáticos para las clases internas. En la discusión de la descarga de clases [1], vemos que el argumento no se aplica realmente a las clases internas, ¡es concebible que las clases internas puedan descargarse! Es concebible que una VM cree una nueva clase interna para cada nueva instancia externa.

Prácticamente ese no es el caso, las clases internas son de hecho tratadas igual que las clases normales. Pero conceptualmente, siempre los pensaré de manera diferente, como clases de instancia privada.

[1] http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.7

Actualización: según [2]

dos tipos de referencia son del mismo tipo en tiempo de ejecución si ... tienen el mismo nombre del archivo binario

y [3]

El nombre binario de una clase anónima (§15.9.5) consiste en el nombre binario de su tipo que lo rodea inmediatamente, seguido de $, seguido de una secuencia de dígitos no vacía.

Entonces, una clase anónima tiene un nombre binario, por lo tanto, solo un tipo de tiempo de ejecución. La especificación nos garantiza que las diferentes instancias de una clase anónima tienen una clase de identidad.

[2] http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.3.4

[3] http://java.sun.com/docs/books/jls/third_edition/html/binaryComp.html#44909

+0

¡Gracias por la información y la referencia! –

Cuestiones relacionadas