我的Spring MVC Web应用程序中分别有两个类定义:Class和Object:
public Class {
//instance variables
int classId;
int className;
}
public Object {
//instance variables
int objectId;
int objectName;
}
我还有一个服务,它返回一个Class和Object列表,定义如下。
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 - List,List分别返回的repsective列表搜索类或对象
我想让搜索文本框简单地搜索类和对象,返回可能是合并列表 - 列表 - 如果你想通过利用方法 getObjectorClassSeedSearch 同时拥有类和对象>强>
实现这一目标的最佳方式是什么? 我隐约知道我想要创建一个包装类,该类包含Class和Object,并且可能在运行时以多态方式确定从列表中返回支持的实例和项目。我猜我在我的应用程序中会有相应的bean。也许是一个带有泛型的练习。
什么是有效的方法?
由于
答案 0 :(得分:2)
为它们提供通用接口/抽象类:
public abstract class Name
{
private int id;
private String name;
// all attendant ctors and getter/setter stuff here.
}
您可以返回一个列表&lt;名称&gt;按需要那样。
好名字很重要。重载“Class”和“Object”,当它们已经是java.lang包的一部分时,只会让你和未来的维护者对你的代码感到悲伤。
这些可能是示例,但我认为没有理由选择其中任何一个类。没有抽象或丰富的行为。根据我在这里看到的内容,我认为这是一个值得重新思考的设计。
答案 1 :(得分: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;
}
}
显然这是一个简单的例子,但你明白了。