2010-01-07 8 views
3

Quelle est la meilleure approche pour créer une classe interne non statique au printemps?créer des classes internes avec le ressort

class A { 
    public class B {} 

    B b; 
    public void setB(B b) {this.b = b;} 
} 

cela semble fonctionner, mais je veux éviter la nécessité d'un argument du constructeur:

<bean id="a" class="A"> 
    <property name="b"> 
    <bean id="b" class="A$B"> 
     <constructor-arg ref="a"/> 
    </bean> 
    </property> 
</bean> 
+1

il n'est pas beaucoup de code à éviter .. – Bozho

+1

non, mais c'est quelque chose qui peut causer des erreurs et est source de confusion – IttayD

Répondre

3

À un certain moment, vous devez spécifier la objet extérieur, il n'y a pas d'éviter cela. Vous pouvez cependant déplacer cela dans Java et de XML, en ajoutant une méthode de fabrication à A qui crée la B intérieure:

public class A { 
    public class B {} 

    B b; 

    public void setB(B b) {this.b = b;} 

    public B createB() {return new B();} // this is new 
} 

Et vous pouvez faire:

<bean id="a" class="test.A"> 
    <property name="b"> 
    <bean id="b" factory-bean="a" factory-method="createB"/> 
    </property> 
</bean> 

Donc le XML est plus simple, mais le java est plus complexe. Le printemps est assez intelligent pour ne pas se fâcher sur les références circulaires apparentes.

Faites votre choix, vous devez en faire un ou autre.

2

Lorsque vous instanciez une classe interne (non statique), vous avez besoin de la référence de la classe externe pour créer un. Je ne vois pas comment vous pouvez l'éviter lorsque l'objet B ne peut être créé dans le cadre d'une instance de A.

A.B b = new A().new B 

ou

A a = new A(); 
A.B b = a.new B(); 
Questions connexes