2012-01-06 5 views
16

que han llegado a Java desde Visual Basic, y parecen pensar que he sido, de muchas maneras, estropeado: pInline objeto de instancias y transformación en Java

¿Hay una manera de crear una instancia de un objeto y modificarlo en línea ? Algo así como:

JFrame aFrame = new JFrame(); 
aFrame.add(new JPanel() {.setSize(100,100) .setLocation(50,50) .setBackground(Color.red) }); 

pude @Override métodos, pero estoy buscando algo más sencillo. He buscado mucho, pero si hay un término específico para este tipo de instanciación en línea, me elude.

¡Gracias por su tiempo!

Respuesta

26

Sí, pero algunas personas lo consideran hacky.

JFrame aFrame = new JFrame(); 
aFrame.add(new JPanel() {{ 
setSize(100,100); 
setLocation(50,50); 
setBackground(Color.red); 
}}); 

Básicamente se añade otra capa de {} (bloque de inicialización ejemplo), que se ejecuta cuando se crea una instancia del panel. por lo tanto, puedes poner cualquier código en él. (como llamar setters).

+1

¿Cómo se llama esta técnica? Me gustaría saber más al respecto. – SJuan76

+3

@ SJuan76 se llama "clase anónima con inicializador" – alf

+0

Está usando un bloque de inicialización de instancia dentro de la clase anónima, y ​​está llamando a métodos heredados como this.setSize ... –

8

Un buen truco se presenta en la respuesta de @ ClickerMonkey. Sin embargo, si una clase compatible con el método de encadenamiento, puede utilizar una sintaxis similar sin el inicializador "piratear":

new ChainClass().setSize(100,100) .setLocation(50,50) .setBackground(Color.red) 

El inconveniente es que el ChainClass debe ser similar a esto:

public class ChainClass { 
    public ChainClass setSize(int w, int h) { 
    // ... 
    return this; 
    } 

    public ChainClass setLocation(int x, int y) { 
    // ... 
    return this; 
    } 

    // etc. 
} 

Este es , por desgracia, no es el caso para la mayoría de las clases estándar de Java. Sin embargo, puedes implementarlo para tus clases.

+4

Esto se conoce como interfaz Fluent. jQuery usa esta técnica. – ComethTheNerd

+1

Eso, allí mismo, es por lo que quiero un tipo de devolución "this" en java. – Kent

+0

Especialmente debido a las clases genéricas ... el método de encadenamiento es molesto con los genéricos cuando tienes subclases. – ClickerMonkey

Cuestiones relacionadas