2009-04-29 10 views
2

ich eine Klasse habe etwas wie folgt aus:Anwesenheit von Konstruktor ohne Argumente bei der Kompilierung (Java)

public class Test { 

    private final List<ISomeType> things = new LinkedList<ISomeType>(); 

    public <T extends ISomeType> Test(Class<T> clazz, int order) { 
     for (int i = 0; i < order; i++) { 
      try { 
       this.things.add(clazz.newInstance()); 
      } catch (Exception e) { 
       // stackoverflowers use your imagination 
      } 
     } 
    } 
} 

Wo ich erwarten und hoffen, dass die Klasse clazz hat ein zugängliches Konstruktor ohne Argumente. Gibt es eine Möglichkeit, die Anwesenheit von es zur Kompilierzeit zu erzwingen?

+1

Der richtige Begriff ist kein Argument-Konstruktor. –

+0

Ich weiß nicht warum, aber diese Methode sieht nicht wie Java aus. – yihtserns

Antwort

4

Es gibt keine Möglichkeit, Konstruktoranforderungen zur Kompilierzeit durchzusetzen. Zur Laufzeit können Sie class.getConstructors() überprüfen und sicherstellen, dass es einen gibt, der keine Argumente hat (oder fangen Sie einfach die Ausnahme ab, wie Sie im Beispielcode sind).

Normalerweise wird die No-Arg-Konstruktor-Anforderung nur im Javadoc der Basisklasse oder Schnittstelle aufgelistet.

-2

Bei Reflection geht es darum, Dinge zur Laufzeit anstatt zur Kompilierzeit auszuführen. Verwenden Sie keine Reflektion, wenn Sie möchten, dass Ihr Code funktioniert.

+0

-1 Ihr Code funktioniert, auch mit Reflection, solange Sie wirklich verstehen, was Sie tun. Aber du hast recht, man sollte Reflection nicht ohne Notwendigkeit verwenden, da du die Kompilierzeitsicherheit verlierst. – Ridcully

1

Am besten erstellen Sie einen Komponententest, der dies für jede Klasse überprüft, die Ihnen wichtig ist, und führen Sie dann die Komponententests zur Erstellungszeit durch. Alternativ können Sie eine Testklasse erstellen, die nicht mit Ihrem Code verteilt wird und nur die Konstruktoren der Klasse ausführt, die Sie interessieren. Keine gute Option.

2

Es gibt einige Tools für die Überprüfung des Codestils, die erweitert werden können, um diese Art von Anforderungen zu überprüfen. Für Eclipse (und andere) kann PMD Ihnen helfen. Wenn Sie sich das Tutorial ansehen, sollten Sie in der Lage sein, eine bestimmte Regel zu schreiben, um nach Konstruktoren ohne Parameter zu suchen.

2

Was ist damit?

interface Provider<T> { 
    T get(); 
} 

public class Test { 

    private final List<ISomeType> things = new LinkedList<ISomeType>(); 

    public <T extends ISomeType> Test(Provider<T> provider, int order) { 
     for (int i = 0; i < order; i++) { 
      try { 
       this.things.add(provider.get()); 
      } catch (Exception e) { 
       // stackoverflowers use your imagination 
      } 
     } 
    } 
} 
1

Der Link unten zeigt, wie eine ähnliche Situation zu lösen (zu prüfen, ob die Unterklassen einer bestimmten Klasse haben all Konstruktor ohne Argumente) mit Hilfe von Java 6 und die Annotation Verarbeitungswerkzeug:

Annotation Processing Tool

Vielleicht können Sie ihre Lösung anpassen, um Ihr Problem zu lösen.

+0

Gute Verbindung. Das könnte sehr gut die Antwort sein. –

Verwandte Themen