2016-05-23 8 views
2

Guten Tag.Java. Generiere swt.table von ArrayList der abstrakten Sammlung

Meine Situation ist folgende:

Ich habe einige Datenbankentitäten Klassen bekam (Auto, Driver, Bill, usw.) mit einigen ihrer Felder. Ich kann ArrayList von ihnen von meiner Datenbank erhalten - ArrayList<Auto>,

Jetzt möchte ich in der Lage sein, swt Tabelle von irgendeiner Sammlung zu erzeugen, die ich habe. Also, in meinen Träumen ist es so etwas wie eine gemeinsame Methode für alle Klassen Sammlungen.

public class TableGenerator{ 
    public Table generate(Shell shell, ArrayList<? extends IDBEntity> instance){ 
     //swt.table creation 
     //passing data into this table 
    } 
} 

So. Die Frage ist: "Kann ich das tun, also wenn ich das kann?" und "Ist es so, dass es sich lohnt zu implementieren oder vielleicht sollte ich verschiedene Methoden für verschiedene Klassen machen?".

Vielen Dank für Ihre Hinweise und Vorschläge.

+0

Sie möchten, dass die Felder jeder Unterklasse von 'IDBEntity' als Spalten in der Tabelle angezeigt werden? – totoro

+0

Ja, du hast Recht –

Antwort

1

Eine Möglichkeit, dies zu erreichen, ist die Verwendung der Visitor Pattern.

  1. erstellen Visitor Schnittstelle:

    public interface DBEntityVisitor { 
        void visit(Auto pAuto); 
        void visit(Driver pDriver); 
        void visit(Bill pBill); 
    } 
    
  2. Zum IDBEntity Schnittstelle und fügen Sie die Methode:

    void accept(DBEntityVisitor pDBEntityVisitor); 
    
  3. Nun zu den konkreten Klassen gehen Auto, Bill und Driver und Implementieren Sie die accept Methode:

    @Override 
        public void accept(DBEntityVisitor pDBEntityVisitor) { 
        pDBEntityVisitor.visit(this); 
        } 
    
  4. in Ihrem TableGenerator:

    public Table generate(Shell shell, ArrayList<IDBEntity> instance){ 
        DBEntityVisitor lVisitor = new DBEntityVisitor() { 
    
        @Override 
        public void visit(Auto pAuto) { 
         System.out.println("I am a car"); 
        } 
    
        @Override 
        public void visit(Driver pDriver) { 
         System.out.println("I am a driver");   
        } 
    
        @Override 
        public void visit(Bill pBill) { 
         System.out.println("I am a bill"); 
        } 
        }; 
        for(IDBEntity lInstance : instance){ 
        lInstance.accept(lVisitor); 
        } 
    } 
    
+1

Whoa, das ist nett, ich werde es versuchen –

+0

ist Besucher akzeptieren es foreach Zyklus verwendet, weil Sie dachte, dass ArrayList verschiedene dbEntities hält? –

+0

ja ich dachte, es hält verschiedene Objekte, die IDBEntity implementiert. Wenn die Liste jedoch nur Auto enthält, wird nur die Visit-Methode von Auto n mal ausgeführt. –

0

Wenn Sie es sehr dynamisch möchten, können Sie die Selbstbeobachtung von Gson, indem Sie Ihre Arrays JSON-Arrays und Objekte Objekte JSON angegeben verwenden.

Gson gson = new Gson(); 

List<IDBEntity> l = new ArrayList<>(); 
l.add(new Auto()); 
l.add(new Driver()); 
l.add(new Bill()); 

String json = gson.toJson(l); 
// Just to view if data is alright. 
System.out.println(json) 

JsonArray a = new JsonParser().parse(json).getAsJsonArray(); 

// Iterate array 
for (JsonElement o: a) { 
    // Iterate fields and values of each object 
    for (Map.Entry<String, JsonElement> e: ((JsonObject) o).entrySet()) { 
     System.out.println(e.getKey()); 
     System.out.println(e.getValue()); 
    } 
} 

Jetzt Ihr Array von Objekten prüfen, ihre Eigenschaften überprüfen Spalten hinzufügen, dann jedes Objekt überfahren und fügen Sie die Werte der Eigenschaften, die es zu den Spalten.

+0

Wow, danke. Ich habe noch nie JSON in Java verwendet, also brauche ich ein wenig Zeit, um Ihren Vorschlag umzusetzen :) –

+0

Es ist immer schön, eine JSON-Version der eigenen Daten zur Hand zu haben, denke ich :-) – totoro

+0

Ja, streiten überhaupt nicht, aber in meinem Anlass ist Zeit Geld :) –