2012-04-10 13 views
15

Ich habe ein Servlet, das, übergeben auf Abfrageparameter, eine Liste von Objekten aus dem DAO, verwandelt die Liste in JSON und sendet es zurück in der Antwort. Jede Liste besteht aus Objekten, die eine Methode haben:Wie können Sie eine List <Objekte, die eine Schnittstelle implementieren> an eine Methode übergeben?

public String getAsJson(){...} 

Und das Servlet hat eine Reihe von meist indentical Methoden, die wie folgt aussehen:

private String getUserListAsJson() { 
    List<User> userList = this.dao.getUsers(); 
    StringBuilder builder = new StringBuilder(); 
    builder.append('['); 
    // loops over the list appending the value of each objects getAsJson() 
    builder.append(']'); 
    return builder.toString(); 
} 

Das Problem ist, dass ich etwa 6 Methoden (und wachsen), die abgesehen von verschiedenen DAO-Abfragen genau so aussehen. Meine Idee war, eine Schnittstelle zu erstellen, die nur die Definition für die getAsJson() -Methode hatte, von jeder Bean zu implementieren und dann eine andere Methode im Servlet zu verwenden, die Objekte übernahm, die diese Schnittstelle implementierten. Am Ende sieht aus wie diese:

public Interface JsonEnabled { 
    public String getAsJson(); 
} 

public class User implements JsonEnabled { 
    .... 
    @Override 
    public String getAsJson() {...} 
} 

public class TheServlet { 
    ... 
    private String getUserListAsJson() { 
     List<User> userList = this.dao.getUsers(); 
     return this.getListAsJson(userList); 
    } 
    private String getListAsJson(List<? implements JsonEnabled> list) { 
     // The loop code that is in each method. 
    } 
} 

Also, wenn jemand dies tatsächlich gelesen hat weit = P, das nicht zusammenstellen und nach einer Dokumentation von Oracle nach oben, können Sie nur haben erweitert und nicht implementiert für generische Parameter. Wenn alle Klassen von einer abstrakten Klasse ausgehen, die nur die getAsJson() -Methode hat, ergibt dies keinen semantischen Sinn (die Klassen sind nicht verwandt).

Ich habe keine gute Lösung für SO gefunden oder einfach nur gegoogelt, so dass jede Hilfe/Einsicht geschätzt würde.

+1

tangential aber möchten Sie wirklich JSON Saiten selbst bauen? Schlage vor, eine Bibliothek wie Jackson oder etwas anderes zu benutzen –

Antwort

36

Für allgemeine Platzhalter das Schlüsselwort extends Werke für beide Klassen und Schnittstellen:

private String getListAsJson(List<? extends JsonEnabled> list) { ... } 

extends hat etwas andere Bedeutung als für die Definition generische Grenzen verwendet - es übersetzt im Wesentlichen „ist, oder erweitert oder Geräte“.

+0

Danke! Das hat wie ein Zauber funktioniert. Ich dachte mir, dass es einen Weg geben müsste, dies zu tun - denke, ich sollte die Dokumentation noch einmal lesen, nachdem du es erklärt hast und ob die Doktoren dasselbe sagen. – Windle

+0

Ich wünschte, ich könnte so viele viele +1 geben Das ist genau das, was ich auch brauchte, und jetzt verstehe ich, was es auch bedeutet. – reidisaki

3

Warum verwenden Sie nicht nur

private String getListAsJson(List<JsonEnabled> list) { ... } 

?

+3

Basierend auf dem OP-Codebeispiel können Sie keinen 'List ' Parameter an diese Funktion übergeben. –

+1

@LuiggiMendoza hat es genagelt. Fühlt sich an, als ob ich die Mühe machen würde, jede Liste in eine Liste zu schreiben Ich könnte genauso gut das JSON dort machen. Ich hatte jedoch den gleichen Gedanken. – Windle

+0

@LuiggiMendoza Ich sehe, danke. Scheint so, als hätte ich diesen Punkt verpasst. Sie können jedoch immer noch die Liste erstellen und sie mit Benutzern füllen und diese Methode dann auch übergeben. –

Verwandte Themen