2016-05-23 6 views
2

おはようございます。Java。抽象コレクションのArrayListからswt.tableを生成

私の状況は以下の通りです:

を私はいくつかのそれぞれの分野でいくつかのデータベース・エンティティクラス(AutoDriverBillなど)を持っています。私は自分のデータベースからそれらのArrayListを得ることができます - ArrayList<Auto>ArrayList<Driver>など

今私は私が持っている任意のコレクションからswtテーブルを生成できるようにします。 私の夢の中では、それはすべてのクラスコレクションの共通の方法のようなものです。

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

So。 「これを行う方法はできますか?」と「これは実装する価値があるのですか、別のクラスに異なるメソッドを作ってもいいでしょうか」という質問があります。

アドバイスやご提案ありがとうございます。

+0

'IDBEntity'のサブクラスのフィールドをテーブルの列として表示しますか? – totoro

+0

よろしくお願いします。 –

答えて

1

これを達成する1つの方法は、Visitor Patternを使用することです。

  1. Visitorインタフェースの作成:IDBEntityインターフェイスに

    public interface DBEntityVisitor { 
        void visit(Auto pAuto); 
        void visit(Driver pDriver); 
        void visit(Bill pBill); 
    } 
    
  2. 移動して、メソッドの追加:さて、具体的なクラスAutoに行くBillDriver

    void accept(DBEntityVisitor pDBEntityVisitor); 
    
  3. をし、 acceptメソッドを実装します。

    あなたTableGenerator
    @Override 
        public void accept(DBEntityVisitor pDBEntityVisitor) { 
        pDBEntityVisitor.visit(this); 
        } 
    
  4. 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

、いいですね、試してみます。 –

+0

は、ArrayListが別のdbEntitiesを保持していると思っているので、foreachサイクルを受け入れてくれますか? –

+0

はい私はそれがIDBEntityを実装する別のオブジェクトを保持していると思いました。それでもリストにAutoのみが含まれている場合、Autoの訪問方法はn回実行されます。 –

0

あなたはそれが非常にダイナミックたい場合は、あなたの配列のJSON配列を作成し、JSONオブジェクトをオブジェクトによってGsonによって与えられたイントロスペクションを使用することができます。

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()); 
    } 
} 

今、各オブジェクト上で実行して、列にそれが持っているプロパティの値を追加し、列を追加するには、そのプロパティをチェックし、オブジェクトのあなたの配列を検査します。

+0

うわー、ありがとう。私はJavaでJSONを使ったことがないので、私はあなたの提案を実装するために少し時間を必要とする:) –

+0

それは手でものをデータのJSONバージョンを持っていることは常に良いことです私は – totoro

+0

はええ、まったく主張しない:-)と思いますが、私の機会に、時間はお金です:) –

関連する問題