2010-02-14 180 views
1

我有一個名爲類在我的Spring MVC的Web應用程序兩類定義和對象分別爲:創建一個包裝類

public Class { 
//instance variables 
int classId; 
int className; 


} 


public Object { 
    //instance variables 
int objectId; 
int objectName; 


} 

我也有一個返回定義如下類和對象的列表的服務。

package com.service; 


import java.util.ArrayList; 
import java.util.List; 
import java.util.Iterator; 
import com.domain.Class; 
import com.domain.Object; 
import com.service.SearchManager; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

import org.hibernate.Query; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.Transaction; 
import org.hibernate.cfg.Configuration; 


import java.io.Serializable; 

public class SempediaSearchManager implements com.service.SearchManager { 

    private SessionFactory sessionFactory; 
    private List<Class> classes; 
    private List<Object> objects; 



    public List<Class> getClassSeedSearch(String classSeed) { 
     Configuration configuration = new Configuration().configure(); 
     sessionFactory = configuration.buildSessionFactory(); 
     Session session = sessionFactory.openSession(); 
     try { 
     Query query = session.createQuery("from Class c where lower(c.className) like lower('" 
       + classSeed + "%')"); 
     return query.list(); 
     } finally { 
     session.close(); 
     } 

    } 
    public List<Object> getObjectSeedSearch(String objectSeed) { 
     Configuration configuration = new Configuration().configure(); 
     sessionFactory = configuration.buildSessionFactory(); 
     Session session = sessionFactory.openSession(); 
     try { 
     Query query = session.createQuery("from Object o where lower(o.objectName) like lower('" 
       + objectSeed + "%')"); 
     return query.list(); 
     } finally { 
     session.close(); 
     } 
    } 


    ????? 
    skeleton method 
    public List<ClassesAndObjects> getObjectorClassSeedSearch(String objectOrClassSeed) { 
     ????? 
    } 

我目前認爲有一個搜索框,允許用戶基於由方法getObjectSeedSearch,並getClassSeedSearch返回repsective名單上搜索任何類或對象 - 分別列出

名單,我倒要允許搜索文本框只需搜索這兩個類和對象,或許返回一個合併的列表 - 列表 - 您是否有通過利用的方法getObjectorClassSeedSearch兩個類和對象

,會是什麼最好的前進方式實施這個。 我隱約知道我想要創建一個包裝類和對象,也許在運行時多態確定哪些實例和項目是從列表中支持返回時。我猜我會在我的應用程序中有一個對應的bean。也許是一個泛型的練習。

什麼是一種有效的方法?

感謝

回答

2

有一個共同的接口/抽象類,對他們倆的:

public abstract class Name 
{ 
    private int id; 
    private String name; 
    // all attendant ctors and getter/setter stuff here. 
} 

您可以返回一個列表,需要這樣<名稱>。

好名字很重要。當它們已經是java.lang包的一部分時,重載「Class」和「Object」只會導致你和未來的維護者對你的代碼感到悲傷。

這些可能是例子,但我沒有看到任何這些類的理由。沒有抽象或豐富的行爲。我會說這是一個值得反思的設計,基於我在這裏看到的。

+0

謝謝。但假設我沒有使用Class和Object類定義,並且使用了兩個不同的方法,可能會使用不同的方法和實例變量,但實例變量除外; clas1Name,class1ID,class2Name和class2ID,對於兩個類都是通用的解決方案 - 保存任一類的對象的列表 - 仍然按照您的建議 – Terman 2010-02-14 03:31:23

+0

您提出的設計仍然存在同樣的問題,而我的抽象類會仍然工作。如果您要在列表中使用單一類型,並且您應該想要,那麼您必須具有通用接口或抽象基類。 – duffymo 2010-02-14 12:28:36

1

我推薦創建一個接口,並有一些類和對象實現的「獲取細節」方法。搞清楚常用的方法可能很難,但最糟糕的情況是你可以使用instanceof並在將它從列表中提取出來之後進行強制轉換(儘管這可能是不良設計的一個症狀)。

如:

public interface SearchResult { 

    public String getDetails(); 

} 

然後:

public class Class implements SearchResult { 
    int classId; 
    int className; 

    public String getDetails() { 
     return "id " + classId + ", name " + className; 
    } 
} 

public class Object implements SearchResult { 
    int objectId; 
    int objectName; 

    public String getDetails() { 
     return "id " + objectId + ", name " + objectName; 
    } 
} 

顯然,這是一個簡單的例子,但你的想法。