2010-09-10 10 views
21

En Java, la forma estándar para crear un objeto está utilizandonueva Object {} Construir

MyClass name = new MyClass(); 

también a menudo ver el constructo

new MyClass() { /*stuff goes in here*/ }; 

He estado buscando en línea por un tiempo y no puede encontrar una buena explicación de lo que hace el segundo estilo de construcción o cómo lo hace.

¿Puede alguien explicar cómo y por qué usaría la segunda construcción?

+0

Una sola cosa: considere usar 'Object' como marcador de posición para el nombre de clase ficticio, porque' Class' es el nombre de una clase en sí! ¡Es bastante raro extender la clase 'Clase', especialmente anónimamente! –

Respuesta

19

Este constructo hace en realidad dos cosas: 1) Declara una clase anónima que amplía la clase que utiliza en el constructor y 2) crea una instancia de esta clase anónima.

Editar: Cuando se utiliza una construcción de este tipo, se puede observar la clase anónima mirando los archivos .class generados. Existe el archivo normal MyClass.class y otro para cada subclase anónima: MyClass$1.class para el primero y así sucesivamente.

+0

¿Sería un buen caso de uso para los objetos que vas a utilizar? Por ejemplo, objetos que pondrías inmediatamente en una matriz? – andrewheins

+1

Mi caso de uso principal sería para una implementación de una interfaz simple (solo un método) o para personalizar un adaptador (por ejemplo, java.awt.event. Stuff). Otro caso de uso es provisto por @ Nathan-Hughes. Regla simple: solo haga las cosas más simples en una clase anónima y use subclases/clases propias para el resto – ZeissS

+0

Eso ayuda, gracias. – andrewheins

3

La segunda construcción crea una instancia de clase anónima que es una subclase de Class.

7

Como ya han dicho otros, crea una instancia de una clase anónima, subclases Class. He aquí un ejemplo de cómo se utiliza comúnmente:

panel.addMouseListener(
    new MouseAdapter() { 
    @Override 
    public void mouseEntered(MouseEvent e) { 
     System.out.println(e.toString()); 
    } 
    } 
); 

El código anterior crea una instancia de una clase anónima que se extiende MouseAdapter. En la clase anónima se ha anulado el método mouseEntered para demostrar que la clase anónima funciona básicamente como cualquier otra clase. Esta es una forma muy conveniente y común de crear oyentes (generalmente simples).

+0

¿Cómo construir la clase MouseAdapter en este caso? – CodeShadow

12

Utilizaría la segunda construcción en el caso de que desee hacer una clase anónima. si tiene un método que toma una devolución de llamada como argumento, puede especificar la implementación de la devolución de llamada en línea en lugar de asignarle un nombre y colocarlo en un archivo separado o declararlo en otro lugar del mismo archivo.

También hay un truco llamado double brace initialization donde se puede obtener alrededor de no tener sintaxis de mapas y listas literales mediante el uso de las clases anónimas, así:

Map map = new HashMap() {{put("foo", 1); put("bar", 2);}}; 

Aquí las llaves anidadas crear un inicializador de instancia. El objeto vinculado al mapa no es un HashMap, su clase es una clase anónima que extiende HashMap. (Eso significa que si tiene una regla PMD sobre clases que necesitan declarar uidos en serie, se quejará de esto.)

Cuestiones relacionadas