2009-06-02 8 views
0
public class StateQueryFilter extends FieldQueryFilter { 
    // private static final Log LOG = LogFactory.getLog(RecommendedParser.class.getName()); 

    public StateQueryFilter() { 
     super("state", 5f); 
     super("city", 5f); 
     super("notdirectory", 5f); 
     //LOG.info("Added a state query"); 
    } 

} 

Et il rapporte:problème constructeur en java

Constructor call must be the first statement in a constructor 

est-il un moyen de le faire fonctionner?

+0

Juste qu'est-ce que vous essayez d'accomplir? – jdigital

+0

Boostez les champs: "state", "city", "notdirectory" – omg

+0

Je pense que vous devrez simplement utiliser plus d'un filtre, si c'est possible. Même si ce code est compilé, il ne fera que renforcer "notdirectory" et non "state" ou "city". –

Répondre

7

Vous pouvez uniquement appeler super une fois dans un constructeur, et ce doit être la première ligne.

Cela n'a même pas de sens de l'appeler plus d'une fois comme vous le faites. L'appel super ne crée pas un nouvel objet; il laisse simplement la superclasse initialiser ses champs. Essayez-vous vraiment d'initialiser les mêmes champs plus d'une fois? Vous essayez probablement de créer trois objets distincts, mais ce n'est pas la façon de le faire. Voir également Using the keyword super dans les didacticiels Java.

+0

C'est un code dans mon plugin nutch pour nutch0.9, utilisé pour travailler. – omg

+1

Cela n'a jamais fonctionné, à moins qu'ils n'aient changé radicalement les règles il y a plusieurs versions. –

+2

* Ce code n'a jamais fonctionné - il n'a jamais été légal d'appeler super (...) plus d'une fois. –

2

Non. Vous essayez de construire l'objet 3 fois, la logique est imparfaite.

+0

mais il a l'habitude de travailler, disons, avec nutch0.9. – omg

2

De section 8.8.7 of the Java Language Specification:

La première déclaration d'un constructeur corps peut être une invocation explicite de un autre constructeur de la même classe ou de la superclasse directe (§8.8.7.1).

Remarque "première" instruction - vous ne pouvez pas en avoir plusieurs. Je trouve des constructeurs qui appellent des setters moche.

+0

Aww! J'allais aller le trouver dans la JLS, mais maintenant je ressemblerais à un voleur de réponse. :( –

2

Une autre option consiste à avoir un constructeur qui prend les arguments.

public StateQueryFilter() { 
    super(/*state*/ 5, /* city */ 5, /*notdirectory*/ 5); 
    //LOG.info("Added a state query"); 
} 

Cependant il semble que vous devriez faire quelque chose comme

public class StateQueryFilter extends FieldQueryFilter { 
    private final String city; 
    private final String state; 
    private final boolean noDirectory; 

    public StateQueryFilter(String city, String state, boolean noDirectory) { 
     this.state = state; 
     this.city = city; 
     this.notDirectory = notDirectory; 
    } 
} 
// later 
FieldQueryFilter filter = new StateQueryFiler("Los Angeles", "California", true); 

BTW: Ne pas utiliser les valeurs flottantes, ils ne sont presque jamais la meilleure option.

+0

Deuxièmement, la recommandation d'éviter les flottants De plus, l'appel de setters à partir d'un constructeur peut en fait entraîner des problèmes si le setter est surchargé dans une classe enfant pour faire en sorte que vtable ne soit pas entièrement construit. pour vous, mais en l'insérant comme vous le faites ici, c'est probablement la bonne décision – James

+0

Une partie de ceci est dictée par l'API: http://lucene.apache.org/nutch/apidocs-0.9/org/apache/nutch/searcher/FieldQueryFilter.html –