2012-01-06 1 views
16

je suis venu à Java à partir de Visual Basic, et semblent penser que je suis, à bien des égards, l'embarras: pobjet en ligne instanciation et transformation en Java

Est-il possible d'instancier un objet et de le modifier en ligne ? Quelque chose comme:

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

j'ai pu @Override méthodes, mais je suis à la recherche de quelque chose plus simple. J'ai beaucoup de recherche, mais s'il y a un terme spécifique pour ce genre d'instanciation inline, ça me échappe.

Nous vous remercions de votre temps!

Répondre

26

Oui, mais certaines personnes le considèrent comme un hacky.

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

Fondamentalement, vous ajoutez une autre couche de {} (instance bloc d'initialisation), qui est exécutée lorsque le panneau est instancié. par conséquent, vous pouvez mettre n'importe quel code dedans. (comme les setters appelant).

+1

Comment s'appelle cette technique? J'aimerais en savoir plus à ce sujet. – SJuan76

+3

@ SJuan76 il est appelé "classe anonyme avec un initialiseur" – alf

+0

Il utilise un bloc d'initialisation d'instance dans la classe anonyme, et appelle ses méthodes héritées comme this.setSize ... –

8

Une belle astuce est présentée dans la réponse de @ ClickerMonkey. Toutefois, si une classe prend en charge le chainage des méthodes, vous pouvez utiliser une syntaxe similaire sans initialiseur « hack »:

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

L'inconvénient est que le ChainClass doit ressembler à ceci:

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

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

    // etc. 
} 

C'est , malheureusement, pas le cas pour la plupart des classes Java standard. Vous pouvez cependant l'implémenter pour vos cours.

+4

Ceci est connu comme une interface Fluent. jQuery utilise cette technique. – ComethTheNerd

+1

Voilà, c'est pourquoi je veux un type de retour "this" en java. – Kent

+0

Surtout à cause des classes génériques ... le chaînage de méthode est gênant avec les génériques quand vous avez des sous-classes. – ClickerMonkey